2013-08-12 11 views
26

Qual è la differenza tra le seguenti righe di codice (rspec) e indipendentemente se sono uguali o diversi, quando si dovrebbe usare uno invece dell'altro?Permetti vs Stub, qual è la differenza?

book = double("book") 
allow(book).to receive(:title) { "The RSpec Book" } 

contro

book = double("book") 
book.stub(:title).and_return("The RSpec Book") 

risposta

30

ci sono 2 differenze, ma il risultato è esattamente lo stesso. Entrambi sono in sintonia con la sintassi di rspec mocks/aspettative.

  1. Uso del metodo #allow anziché #stub. Il primo caso utilizza la nuova sintassi rspec introdotta quest'anno. Questo è ora il modo preferito di usare rspec. Anche se la vecchia sintassi non è deprecata, sarà probabilmente disabilitata per impostazione predefinita in rspec3. Maggiori informazioni su questo argomento dal manutentore di RSpec: http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3

  2. L'uso del blocco, invece di #and_return per definire il valore di ritorno. Questo non ha nulla a che fare con il cambiamento di sintassi menzionato; entrambi gli approcci sono disponibili da un po '(da rspec 1). È più appropriato utilizzare il metodo #and_return, poiché è (a) il modo predefinito, (b) più leggibile e (c) viene fornito senza alcun sovraccarico di runtime. Il secondo approccio usando il blocco è solitamente riservato ai casi d'angolo, quando si desidera restituire qualcosa di più dinamico, non una costante, ma una sorta di calcolo.

La risposta alla sua domanda sarebbe quella di utilizzare combinazione di entrambi:

  • utilizzare il #allow invece di #stub
  • uso #and_return al posto di blocco, a meno che non è necessario restituire dinamicamente valore calcolato

esempio:

book = double('book') 
allow(book).to receive(:title).and_return('The RSpec Book') 
+1

'REAME di rspec-mocks 'sembra menzionare solo' allow'. Lo trovo strano poiché 'MyClass.stub (blah: 20)' è più conciso di 'allow (MyClass) .per ricevere (: blah) .and_return (20)'. – gylaz

+1

@gylaz Leggi il [primo articolo] (http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax) in questa risposta. Fornisce una buona panoramica del motivo per cui consentire/aspettare è meglio. tl; dr: la sintassi più vecchia è incline a produrre guasti strani e confusi. La nuova sintassi risolve questi problemi mantenendo un'elevata leggibilità. – Andrew

Problemi correlati