9 Stimmen

RSpec, wie öffnet man einen Stub?

Ich habe versucht, einen Stummel open , die open-uri-Version, und ich habe keinen Erfolg.

Ich habe Folgendes versucht, aber die Anfrage wird immer wieder weitergeleitet:

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

Ich habe auch versucht, Folgendes zu tun

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

Da ich aufgespürt habe, dass dort HTTP-Anfragen in OpenURI gestellt wurden.

Vielen Dank im Voraus für alle Vorschläge!

13voto

bonyiii Punkte 2733

Das tue ich

class Gateway

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

end

In meiner Spezifikation mache ich folgendes:

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

9voto

gaqzi Punkte 3577

Ich habe eine Lösung hier auf Stack Overflow gefunden, nachdem ich etwas mehr Zeit mit Google verbracht habe (ich kann nicht glauben, dass ich das nicht früher gefunden habe).

Erläuterung entnommen aus aquí und geschrieben von Tony Pitluga (nicht verlinkbar).

Wenn Sie sleep im Kontext eines Objekts aufrufen, sollten Sie es auf das Objekt stubben[...]
Der Schlüssel dazu ist, sleep auf das "Selbst" zu legen, das in dem Kontext steht, in dem sleep aufgerufen wird.

Also habe ich das getan, und es hat alles geklappt:

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

1voto

wuputah Punkte 11174

Ich würde empfehlen, stattdessen etwas zu verwenden, das das Netzwerk überbrückt. Ich glaube, der derzeitige Favorit für diese Aufgabe ist FakeWeb [ docs ]. Sie könnten auch interessiert sein an fakeweb-matcher für rspec.


Leider funktioniert FakeWeb möglicherweise nicht mit open() Eigentlich ist es ein Stubs Net::HTTP Ich bin mir also nicht sicher, ob das funktionieren wird. Jede Chance, nicht mit open() ? :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X