4

我正在编写一个类似 ATM 系统的套接字/服务器解决方案。如果有人能告诉我我错过了什么,我将不胜感激。出于某种原因,运行存根测试套件时出现以下错误:

# 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
4

2 回答 2

12

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

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

错误在start定义的方法中SpoofServer.rb,在第 12 行,错误的行是:

@listener_thread = new Thread do

那应该是:

@listener_thread = Thread.new do

正如您所写的那样,您实际上正在做的是调用将类作为参数new传递的方法。Thread由于没有newSpoofServer类的实例定义方法,因此您会遇到NoMethodError异常。

于 2013-05-14T11:45:21.757 回答
0

在实例方法体中,SpoofServer#start不能调用类方法SpoofServer.newnew

于 2013-05-14T11:45:01.043 回答