2011-01-15 20 views
27

Come testare un'azione del controllore che invia un file?RSpec send_file testing

Se eseguo il test controller.should_receive(:send_file) con "Modello mancante" perché non viene eseguito il rendering.

risposta

34

Da Googlingaround, sembra che render verrà chiamato anche a un certo punto .. ma senza modello, causerà un errore.

La soluzione sembra essere quella di stub fuori così:

controller.stub!(:render)
+0

Nizza, perché non ci ho pensato di che :) – Mirko

+1

Per chiunque visualizzi questo usando le versioni più recenti di RSpec, 'stub!' È stato deprecato. Basta usare 'stub' –

+3

E in Rspec 3, è' allow (controller) .per ricevere (: render) ' – mehulkar

24

Un altro modo che funziona è:

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

Per me, questo coglie il fatto che l'effetto collaterale previsto di send_file è organizzare che nient'altro sia reso. (Anche se, sembra certamente un po 'traballante per avere lo stub chiamare un metodo sull'oggetto originale.)

+0

Rails 4, RSpec 3:' 'and_return {value}' è deprecato. Usa "and_return (valore)" o un blocco di implementazione senza "and_return" invece –

6

È anche possibile fare questo:

result = get .... 

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