Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get "Undefined method ::new" in simple classes?

Tags:

ruby

I am writing an ATM-system-like socket/server solution. I would appreciate if someone could tell me what I'm missing. For some reason, I get the following error running my stub test suite:

# Running tests:

.E

Finished tests in 0.002411s, 829.4384 tests/s, 414.7192 assertions/s.

  1) Error:
test_0001_connects_to_a_host_with_a_socket(AtmClient::connection):
NoMethodError: undefined method `new' for #<SpoofServer:0x9dce2dc @clients=[], @server=#<TCPServer:fd 5>>
    /media/wildfyre/Files/Programming/KTH/progp/Atm/spec/client/SpoofServer.rb:12:in `start'
    /media/wildfyre/Files/Programming/KTH/progp/Atm/spec/client/client_spec.rb:12:in `block (3 levels) in <top (required)>'

2 tests, 1 assertions, 0 failures, 1 errors, 0 skips

My minispec file is:

require_relative '../spec_helper.rb'
require_relative '../../lib/AtmClient.rb'
require_relative 'SpoofServer.rb'

describe AtmClient do
  it "can be created with no arguments" do
    AtmClient.new.must_be_instance_of AtmClient
  end

  describe 'connection' do
    it "connects to a host with a socket" do
      spoof = SpoofServer.new.start
      client = AtmClient.new.connect
      spoof.any_incoming_connection?.must_be true
      spoof.kill
    end
  end
end

My SpoofServer file is:

require 'socket'

class SpoofServer

  def initialize
  end

  def start
    @clients = []
    @server = TCPServer.new 1234

    @listener_thread = new Thread do
      @clients.add @server.accept
    end
  end

  def any_incoming_connection?
    @clients.size > 0
  end

  def kill
    @listener_thread.exit
    @clients.each {|c| c.close}
  end

end
like image 225
Erik Lindström Avatar asked Dec 15 '22 10:12

Erik Lindström


1 Answers

As you can read in the trace of the calls stack:

NoMethodError: undefined method `new' for #<SpoofServer:...>
    /.../spec/client/SpoofServer.rb:12:in `start'

The error is inside the start method defined in SpoofServer.rb, at line 12, the wrong line is:

@listener_thread = new Thread do

That should be:

@listener_thread = Thread.new do

As you have written it, what you are actually doing is to calling the new method passing the Thread class as argument. Since no new method is defined for instances of the SpoofServer class you get the NoMethodError exception.

like image 184
toro2k Avatar answered Jan 06 '23 04:01

toro2k