Pregunta sobre rspec-rails – ¿Cómo rspec simular open-uri?

14

Tengo este código simple donde estoy enviando solicitud de http y leyendo toda la respuesta. Aquí está mi código de rieles

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

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

He tratado de usar esta declaración

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

pero sigo recibiendo este error

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

Tu respuesta

4   la respuesta
18

Pensé que elopen método se define en el nivel de laKernel, pero estaba equivocado.

Si te gustaría burlarte delopen, deberias hacerlo en lanivel de tu objeto Me gusta esto:

it "should do something" do
  object_under_test = ObjectUnderTest.new
  object_under_test.should_receive(:open).with("http://example.org")
end
Esto es bueno y puede usar expect (object_under_test) .to receive (: open) .with (cualquier cosa) .and_return (File.read (File.new (Rails.root.join ("spec / fixtures / images / sample.jpeg "))) para apagar una lectura de archivo S3 durante una prueba. Dave Collins
0

Al talónopen-uri puedes usar esta sintaxisRSpec 3+

file = double('file')
expect(OpenURI).to receive(:open_uri).and_return(file)
3

Yo si:

my_object.stub_chain(:open, :read) { "my return value" }
@Brian ¿Re-formatea cómo? ¿Qué te gustaría expandir? Utilizandostub_chain  así significa que puedes llamaropen("whatever").read dentromy_object y obtendrás"my_return_value" atrás. Henrik N
tienes razón. Su respuesta fue clasificada como de "baja calidad" (debido a su longitud) cuando la estaba revisando. Hice una investigación más tarde esa noche y resulta que tu respuesta es correcta (a pesar de la brevedad). He eliminado el comentario y he hecho +1 en tu respuesta. Mis disculpas, señor! Brian
Recibo una advertencia de desaprobación al usar stub_chain en Rspec 3.3.1. ¿Qué es lo nuevo: esperar sintaxis para esto? Epigene
2

De acuerdo a este enlacehttp://distillations.2rye.com/2011/08/mock-the-web-openuri/ la función abierta se define en el módulo Kernel, pero se mezcla con su controlador. Por lo tanto, es necesario que apague 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

Preguntas relacionadas