2012-05-29 14 views
10

Ho questo semplice codice dove sto inviando la richiesta http e leggendo tutta la risposta. Ecco il mio codice rotaieCome rspec mock open-uri?

open("http://stackoverflow.com/questions/ask") 

Come posso scrivere spec per questa riga di codice. Non ho la possibilità di usare mocha e webmock. Posso usare solo il framework di simulazione di Rpsec.

ho cercato di utilizzare questa istruzione

OpenURI.stub!(:open_uri).should_receive(:open).with("http://stackoverflow.com/questions/ask") 

ma continuo a ricevere questo errore

RSpec::Mocks::MockExpectationError: (#<RSpec::Mocks::MessageExpectation:0xd1a7914>).open("http://stackoverflow.com/questions/ask") 
expected: 1 time 
received: 0 times 

risposta

17

ho pensato che il metodo open è definito a livello del Kernel, ma mi sbagliavo .

Se volete prendere in giro il open, si dovrebbe fare a livello del vostro oggetto in questo modo:

it "should do something" do 
    object_under_test = ObjectUnderTest.new 
    object_under_test.should_receive(:open).with("http://example.org") 
end 
+1

Questo è bello e si può utilizzare aspettare (object_under_test) .to ricevere (: aperto) .con (nulla) .and_return (File.read (File.new (Rails.root.join ("spec/fixtures/images/sample.jpeg")))) per eseguire lo stub di un file S3 letto durante un test. –

2

Secondo questo link http://distillations.2rye.com/2011/08/mock-the-web-openuri/ la funzione di apertura è definita sul modulo del kernel, ma mescolato nel controller. Pertanto è necessario interrompere la chiamata a quel livello. Questa soluzione funziona bene per le prove del controller RSpec:

html_content = <<-EOS 
      <html><head> 
      <title>Some Title</title> 
      </head> 
      <body>Some Content</body></html> 
     EOS 

    YourController.any_instance.stub(:open).and_return html_content 
3

ho fatto:

my_object.stub_chain(:open, :read) { "my return value" } 
+0

@Brian Ricostituire come? Cosa vorresti ampliare? L'uso di 'stub_chain' come questo significa che puoi chiamare' open ("qualunque cosa"). Read' in 'my_object' e otterrai' "my_return_value" 'indietro. –

+0

hai ragione. La tua risposta è stata classificata come "di bassa qualità" (a causa della sua lunghezza) quando la stavo recensendo. Ho fatto qualche ricerca più tardi quella sera e si scopre che la tua risposta è corretta (nonostante la brevità). Ho rimosso il commento e ho fatto +1 sulla tua risposta. Le mie scuse, signore! – Brian

+0

Viene visualizzato un avviso di deprecazione quando si utilizza stub_chain in Rspec 3.3.1. Qual è il nuovo: aspettarsi la sintassi per questo? – Epigene