为什么我在简单类中会出现“Undefined method ::new”错误?

4

我正在编写一个类似ATM系统的socket/server解决方案。如果有人能告诉我缺少了什么,我将不胜感激。由于某种原因,在运行我的桩测试套件时出现以下错误:

# 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

我的 minispec 文件如下:

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

我的 SpoofServer 文件是:
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
2个回答

12

正如您可以在调用堆栈的跟踪中读到的那样:

NoMethodError: undefined method `new' for #<SpoofServer:...>
    /.../spec/client/SpoofServer.rb:12:in `start'
错误位于 SpoofServer.rb 中定义的 start 方法内部,在第 12 行,错误行为:
@listener_thread = new Thread do

应该是这样的:

@listener_thread = Thread.new do

根据你的写法,实际上你所做的是调用new方法并将Thread类作为参数传递。由于SpoofServer类的实例中没有定义任何new方法,因此会出现NoMethodError异常。


0
在实例方法 SpoofServer#start 中,你不能通过 new 调用类方法 SpoofServer.new

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接