Я пытаюсь запустить функциональный тест на небольшом сервере, который я создал. Я использую Ruby 1.9.2 и RSpec 2.2.1 в Mac OS X 10.6. Я проверил, что сервер работает правильно и не вызывает проблем, с которыми я сталкиваюсь. В моей спецификации я пытаюсь создать процесс для запуска сервера, запустить несколько примеров и затем завершить процесс, на котором запущен сервер. Вот код для моей спецификации:
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), потому что он запускается не в том порядке, в котором я думал. Почему это происходит? Что мне нужно сделать, чтобы мои спецификации