2011-01-17 5 views
4

Ich versuche, einen Funktionstest auf einem kleinen Server, den ich erstellt habe, auszuführen. Ich laufe Ruby 1.9.2 und RSpec 2.2.1 unter Mac OS X 10.6. Ich habe überprüft, dass der Server ordnungsgemäß funktioniert und die Probleme nicht verursacht, die ich erhalte. In meiner Spezifikation versuche ich, einen Prozess zu starten, um den Server zu starten, einige Beispiele auszuführen und dann den Prozess zu beenden, der den Server ausführt. Hier ist der Code für meine spec:Wie kann ich in RSpec 2 einen Prozess generieren, einige Beispiele ausführen und diesen Prozess dann beenden?

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 

Wenn ich die spec laufen, scheint es, dass die vor (: all) und nach (: alle) Blöcke ausgeführt werden, und die Server-Prozesse getötet wird, bevor die Beispiele ausgeführt werden , weil ich die folgende Ausgabe:

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)>' 

Wenn ich kommentieren sie den Anruf zu Process.kill, wird der Server gestartet und die Tests ausgeführt, aber der Server bleibt ausgeführt wird, was bedeutet, dass ich manuell zu töten, es zu gehen.

Es scheint, als ob ich falsch verstehe, was die after (: all) -Methode tun soll, weil sie nicht in der Reihenfolge ausgeführt wird, in der ich dachte, sie würde es tun. Warum passiert dies? Was muss ich tun, damit meine Spezifikationen

Antwort

1

Sind Sie sicher, dass der Server bereit ist, Verbindungen zu akzeptieren? Vielleicht würde so etwas helfen:

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 
+0

Das sieht aus wie es das Problem war. Vielen Dank! – jergason

Verwandte Themen