2010-08-30 7 views
8

He intentado colgar open, la versión de open-uri, y no estoy teniendo éxito.¿Cómo saber cómo abrir?

He intentado hacer lo siguiente pero la petición sigue pasando a través de:

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

También he intentado hacer

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

Desde localicé que fue donde se hicieron las peticiones HTTP en OpenURI.

Gracias de antemano por cualquier sugerencia!

Respuesta

8

Encontré una solución aquí en Stack Overflow después de un tiempo más en Google (no puedo creer que no haya encontrado esto antes).

Explicación tomada de here y escrita por Tony Pitluga (no enlazable).

Si llama el sueño en el contexto de un objeto, debe código auxiliar en el objeto [...]
La clave es, al código auxiliar del sueño en lo que sea "sí" es en el contexto en el sueño se llama.

Así que lo hice y todo resuelto:

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

¡Agradable! Creo que es razonable editar esto y publicarlo como la solución para 'open()' y aceptar tu propia respuesta. Puede ser difícil encontrar el artículo 'sleep()' al anotar 'open()'. – wuputah

+0

Muy buen punto en el trozo en cualquiera que sea el contexto de uno mismo. Esto me ayudó a resolver un problema similar, ¡gracias! – stuartc

+0

He actualizado tu código. Explicación aquí: http://stackoverflow.com/a/11258596/608361 – Zsolt

1

Yo recomendaría usar algo para colgar la red en su lugar. Creo que el favorito actual para hacerlo es FakeWeb [docs]. Usted también podría estar interesado en fakeweb-matcher para rspec.


Por desgracia, creo que FakeWeb podría no funcionar con open(), en realidad, es muñones Net::HTTP, así que no estoy seguro de si eso va a funcionar. ¿Alguna posibilidad de no usar open()? :)

+0

' open() 'se ajusta perfectamente a donde va el código, por lo que utilizar' Net: HTTP' directamente podría parecer un error. :) Pasé más tiempo en Google y encontré otra pregunta de Stack Overflow que me ayudó. ¡Pero gracias por intentarlo! – gaqzi

11

Aquí es lo que hago

class Gateway 

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

end 

En mi especificación hago lo siguiente:

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

Creo que esta es una gran forma de solucionar este tipo de problemas. Gracias por recordarme :) – nruth

+1

Además, 'Gateway.any_instance.stub_chain (...)' – kgilpin