2011-01-15 19 views
27

Cómo probar una acción del controlador que envía un archivo?RSpec send_file testing

Si lo hago con controller.should_receive(:send_file), la prueba falla con "Falta la plantilla" porque no se procesa nada.

Respuesta

34

De Googlingaround, parece que render también se llamará en algún momento ... pero sin plantilla, causará un error.

La solución parece ser la de código auxiliar fuera así:

controller.stub!(:render)
+0

Niza, ¿por qué no pensé en eso :) – Mirko

+1

Para cualquier persona que vea esto usando versiones más recientes de RSpec, 'stub!' Ha quedado en desuso. Solo use 'stub' –

+3

Y en Rspec 3, es' allow (controller) .to receive (: render) ' – mehulkar

24

Otra forma en que funciona es:

controller.should_receive(:send_file).and_return{controller.render :nothing => true} 

Para mí, esta captura el hecho de que el efecto secundario previsto de send_file es disponer que no se represente nada más. (No obstante, es cierto que parece un poco flojo para que el talón de llamar a un método en el objeto original.)

+0

Rails 4, RSpec 3:''and_return {value} 'está en desuso. Utilice 'and_return (value)' o un bloque de implementación sin 'and_return' en su lugar. –

6

También puede hacer esto:

result = get .... 

result.body.should eq IO.binread(path_to_file)