2010-08-30 2 views
8

Sto provando a stub open, la versione open-uri, e non ci riesco.RSpec come aprire lo stub?

Ho provato a fare il seguente ma la richiesta continua a andare attraverso:

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

Ho anche provato a fare

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

Da quando ho rintracciato era lì che sono state fatte richieste HTTP in OpenURI.

Grazie in anticipo per eventuali suggerimenti!

risposta

8

Ho trovato una soluzione qui su Stack Overflow dopo un po 'di tempo su Google (non posso credere di non averlo trovato prima).

Spiegazione preso da here e scritto da Tony Pitluga (non collegabili).

Se si chiama il sonno nel contesto di un oggetto, si dovrebbe stub sul oggetto [...]
La chiave è, a stub dormire su qualunque "io" è nel contesto in cui il sonno è chiamato.

così ho fatto questo e tutto ha funzionato:

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

Bello! Penso che sia ragionevole modificare questo e pubblicarlo come soluzione per 'open()' e accettare la propria risposta. Potrebbe essere difficile trovare l'articolo 'sleep()' durante lo stubing 'open()'. – wuputah

+0

Ottimo punto sullo stubing su qualunque sia il contesto del sé. Questo mi ha aiutato a risolvere un problema simile, grazie! – stuartc

+0

Ho aggiornato il tuo codice. Spiegazione qui: http://stackoverflow.com/a/11258596/608361 – Zsolt

1

Si consiglia di utilizzare qualcosa per stub la rete, invece. Credo che l'attuale favorito per farlo sia FakeWeb [docs]. Potresti anche essere interessato a fakeweb-matcher per rspec.


Ahimè, penso FakeWeb potrebbe non funzionare con open(), in realtà, Stub Net::HTTP, quindi non sono sicuro se questo funzionerà. Qualche possibilità di non utilizzare open()? :)

+0

' open() 'è perfetto per il punto in cui il codice sta andando in modo che usando' Net: HTTP' direttamente si senta semplicemente sbagliato. :) Ho trascorso altro tempo su Google e ho trovato un'altra domanda di Stack Overflow che mi ha aiutato. Ma grazie per aver provato! – gaqzi

11

Ecco quello che faccio

class Gateway 

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

end 

Nella mia spec faccio la seguente:

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

Penso che questo sia un ottimo modo per aggirare questo tipo di problema. Grazie per avermelo ricordato :) – nruth

+1

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