В RSpec 2, как я могу запустить процесс, запустить несколько примеров и затем убить этот процесс? - PullRequest
4 голосов
/ 17 января 2011

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

1 Ответ

1 голос
/ 18 января 2011

Вы уверены, что сервер готов принимать соединения?Может быть, что-то подобное поможет:

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
...