4

作成した小さなサーバーで機能テストを実行しようとしています。Mac OSX10.6でRuby1.9.2とRSpec2.2.1を実行しています。サーバーが正しく機能し、発生している問題が発生していないことを確認しました。私の仕様では、サーバーを起動し、いくつかの例を実行してから、サーバーを実行しているプロセスを強制終了するプロセスを生成しようとしています。これが私のスペックのコードです:

describe "Server" do
  describe "methods" do

    let(:put) { "put foobar beans 5\nhowdy" }

    before(:all) do
      @pid = spawn("bin/server")
    end

    before(:each) do
      @sock = TCPSocket.new "127.0.0.1", 3000
    end

    after(:each) do
      @sock.close
    end

    after(:all) do
      Process.kill("HUP", @pid)
    end

    it "should be valid for a valid put method" do
      @sock.send(put, 0).should == put.length
      response = @sock.recv(1000)
      response.should == "OK\n"
    end

    #more examples . . .

  end
end

仕様を実行すると、before(:all)ブロックとafter(:all)ブロックが実行され、例が実行される前にサーバープロセスが強制終了されたように見えます。これは、次の出力が得られるためです。

F

Failures:

  1) Server methods should be valid for a valid put method
     Failure/Error: @sock = TCPSocket.new "127.0.0.1", 3000
     Connection refused - connect(2)
     # ./spec/server_spec.rb:11:in `initialize'
     # ./spec/server_spec.rb:11:in `new'
     # ./spec/server_spec.rb:11:in `block (3 levels) in <top (required)>'

の呼び出しをコメントアウトするとProcess.kill、サーバーが起動してテストが実行されますが、サーバーは実行されたままです。つまり、手動でサーバーを強制終了する必要があります。

after(:all)メソッドは、思った順序で実行されていないため、何をするのか誤解しているようです。なぜこうなった?スペックを上げるために何をする必要がありますか

4

1 に答える 1

1

サーバーが接続を受け入れる準備ができていますか?たぶん、このようなものが役立つでしょう:

before(:each) do
  3.times do
    begin
      @sock = TCPSocket.new "127.0.0.1", 2000
      break
    rescue
      sleep 1
    end
  end
  raise "could not open connection" unless @sock
end
于 2011-01-17T23:15:01.763 に答える