Ruby 在RSpec2中,如何生成一个进程,运行一些示例,然后杀死该进程?

Ruby 在RSpec2中,如何生成一个进程,运行一些示例,然后杀死该进程?,ruby,rspec2,spawn,Ruby,Rspec2,Spawn,我正在尝试在我创建的一个小型服务器上运行一些功能测试。我在MacOSX10.6上运行Ruby1.9.2和RSpec2.2.1。我已验证服务器工作正常,并且没有造成我遇到的问题。在我的规范中,我试图生成一个进程来启动服务器,运行一些示例,然后杀死运行服务器的进程。以下是我的规范代码: describe "Server" do describe "methods" do let(:put) { "put foobar beans 5\nhowdy" } before(:all

我正在尝试在我创建的一个小型服务器上运行一些功能测试。我在MacOSX10.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)>'
F
失败:
1) 服务器方法应该对有效的put方法有效
失败/错误:@sock=TCPSocket.new“127.0.0.1”,3000
连接被拒绝-连接(2)
#./spec/server_spec.rb:11:in'initialize'
#./spec/server_spec.rb:11:in'new'
#./spec/server_spec.rb:11:in'block(3层)in'
当我注释掉对
Process.kill
的调用时,服务器会启动,测试也会运行,但服务器仍在运行,这意味着我必须手动终止它


似乎我误解了after(:all)方法应该做什么,因为它没有按照我认为的顺序运行。为什么会这样?我需要做些什么才能使我的规范生效?您确定服务器已准备好接受连接吗?也许这样做会有所帮助:

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

看来这就是问题所在。谢谢