作成した小さなサーバーで機能テストを実行しようとしています。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)メソッドは、思った順序で実行されていないため、何をするのか誤解しているようです。なぜこうなった?スペックを上げるために何をする必要がありますか