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

私のミニスペックファイルは次のとおりです。

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.rb12 行目にあり、間違った行は次のとおりです。

@listener_thread = new Thread do

それは次のようになります。

@listener_thread = Thread.new do

あなたが書いたように、あなたが実際にやっていることは、クラスを引数としてnew渡すメソッドを呼び出すことです。クラスのインスタンスに対してメソッドが定義されてThreadいないため、例外が発生します。newSpoofServerNoMethodError

于 2013-05-14T11:45:21.757 に答える