2010-08-30 9 views
8

Ich habe versucht, stummel open, die Open-Uri-Version, und ich bin nicht erfolgreich.RSpec wie stub open?

Ich habe versucht, das folgende zu tun, aber die Anfrage läuft weiter durch:

Kernel.should_receive(:open).and_return("Whatever for now") 

Ich habe auch

OpenURI::OpenRead.should_receive(:open).and_return("Whatever for now") 

zu tun versucht Da ich aufgespürt das war, wo HTTP-Anfragen gemacht wurden in OpenURI.

Vielen Dank im Voraus für Anregungen!

Antwort

8

Ich fand eine Lösung hier auf Stack Overflow nach etwas mehr Zeit auf Google (ich kann nicht glauben, dass ich das vorher nicht gefunden habe).

Erklärung entnommen von here und geschrieben von Tony Pitluga (nicht verknüpfbar).

Wenn Sie schlafen im Rahmen eines Objekts aufrufen, sollten Sie es auf dem Objekt Stummel [...]
Der Schlüssel ist, Stummel Schlaf auf, was „Selbst“ ist im Zusammenhang mit dem Schlaf wird genannt.

Also tat ich dies und es geklappt hat:

let(:read) { mock('open') } 

it "should return the new log-level when the log level was set successfully" do 
    read.stub(:read).and_return('log-level set to 1') 
    kannel.should_receive(:open).and_return(read) 

    kannel.set_log_level(1).should == 1 
    end 
+0

Schön! Ich denke, es ist sinnvoll, dies zu bearbeiten und es als Lösung für 'open()' zu veröffentlichen und Ihre eigene Antwort zu akzeptieren. Es kann schwierig sein, den 'sleep()' -Artikel zu finden, wenn 'open()' gestempelt wird. – wuputah

+0

Sehr guter Punkt auf Stubbing auf was auch immer der Kontext des Selbst ist. Dies hat mir geholfen, ein ähnliches Problem zu lösen, danke! – stuartc

+0

Ich habe Ihren Code aktualisiert. Erklärung hier: http://stackoverflow.com/a/11258596/608361 – Zsolt

1

Ich würde empfehlen, etwas zu verwenden, um das Netzwerk stattdessen zu stopfen. Ich glaube, der aktuelle Favorit dafür ist [docs]. Sie könnten auch interessiert sein an fakeweb-matcher für rspec.


Ach, ich glaube, FakeWeb vielleicht nicht mit open() arbeiten, tatsächlich, es Net::HTTP Stubs, also bin ich nicht sicher, ob das funktionieren wird. Irgendeine Chance, open() nicht zu verwenden? :)

+0

' open() 'ist eine perfekte Ergänzung für den Code, so dass' Net: HTTP' sich direkt falsch anfühlt. :) Ich verbrachte etwas mehr Zeit auf Google und fand eine andere Stack Overflow Frage, die mir geholfen hat. Aber danke fürs ausprobieren! – gaqzi

11

Hier ist, was ich tun

class Gateway 

    def do_something 
    open('http://example.com').read 
    end 

end 

In meinem spec ich den folgenden Code:

describe 'communication' do 

    it 'should receive valid response from example.com' do 
    gateway = Gateway.new 
    gateway.stub_chain(:open, :read).and_return('Remote server response') 

    gateway.do_something.should == "Remote server response" 
    end 

end 
+0

Ich denke, das ist ein guter Weg um diese Art von Problem. Danke für die Erinnerung :) – nruth

+1

Auch, 'Gateway.any_instance.stub_chain (...)' – kgilpin