2012-05-29 17 views
10

Tengo este código simple donde estoy enviando solicitud HTTP y leyendo toda la respuesta. Aquí está mi código rieles¿Cómo rspec se burla de Open-Uri?

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

¿Cómo puedo escribir las especificaciones para esta línea de código. No tengo la opción de usar mocha y webmock. Solo puedo usar el marco de burla de Rpsec.

me han tratado de utilizar esta declaración

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

pero me siguen dando este error

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

Respuesta

17

pensé que el método open se define en el nivel de la Kernel, pero estaba equivocado .

Si desea burlarse de la open, debe hacerlo en el nivel de su objeto así:

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

Esto es agradable y se puede utilizar esperar (object_under_test) .para recibir (se abre) .con (nada) .and_return (File.read (File.new (Rails.root.join ("spec/fixtures/images/sample.jpeg")))) para anular una lectura de archivo S3 durante una prueba. –

2

De acuerdo con este enlace http://distillations.2rye.com/2011/08/mock-the-web-openuri/ la función de apertura se define en el módulo del kernel, pero mezclado en tu controlador. Por lo tanto, debe anular la llamada en ese nivel. Esta solución funciona bien para las pruebas del controlador 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

que hice:

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

@Brian ¿Volver a formatear cómo? ¿Qué te gustaría expandir? Usar 'stub_chain' de esta manera significa que puedes llamar' open ('whatever '). Read' dentro de' my_object' y obtendrás '' my_return_value "' de nuevo. –

+0

tienes razón. Su respuesta fue clasificada como de "baja calidad" (debido a su longitud) cuando la estaba revisando. Investigué más tarde esa noche y resulta que tu respuesta es correcta (a pesar de la brevedad). He eliminado el comentario y respondí +1 en tu respuesta. Mis disculpas, señor! – Brian

+0

Recibo una advertencia de desactivación al usar stub_chain en Rspec 3.3.1. ¿Cuál es el nuevo: espera la sintaxis para esto? – Epigene

Cuestiones relacionadas