2009-10-16 6 views
8

ho questo codice:Rspec Mocks: finto/cedere il blocco da una chiamata di metodo

Net::SSH.start(@server, @username, :password => @password) do |ssh| 
      output = ssh.exec!(@command) 
      @logger.info 'SSH output: ' 
      @logger.info output 
     end 

posso prendere in giro lo SSH.Start utilizzando quadro finta di RSpec come questo, per dirmi che ho ha iniziato la sessione SSH:

Net::SSH.should_receive(:start).with("server", "user", :password => "secret") do 
      @started = true 
     end 

questo mi dice se ho @ avviato la sessione ssh. ora ho bisogno di prendere in giro ssh.exec! metodo, che è abbastanza facile:

Net::SSH.should_receive(:exec!).with("command")...

Ma come si fa cedo/richiamare il blocco che contiene lo ssh.exec! chiamata al metodo, dal momento che ho deriso il metodo SSH.start? c'è probabilmente un metodo semplice che posso chiamare per eseguire questo blocco, ma non so cosa sia e non riesco a trovare alcuna spiegazione/documentazione veramente buona sulla struttura di derisione di rspec.

risposta

19
Net::SSH.should_receive(:start).with(
    "server", "user", :password => "secret").and_yield(
    "whatever value the block should yield") 

Non certo perché è necessario impostare @started, dal momento che la should_receive verifica che il metodo è stato chiamato.

+0

non sapeva che su should_receive ... c'è qualche buona documentazione su questa roba? il mio google-fu mi sta fallendo ... anche - cosa succede se non mi interessa il valore di ritorno del blocco ceduto? Voglio solo che sia eseguito, in modo che possa chiamare should_receive su ssh.exec! metodo. –

+0

Questo è ciò che 'should_receive' significa: se non viene ricevuto, il test fallirà. Per quanto riguarda la documentazione, il libro RSpec è eccellente. Lo consiglio sia per imparare a usare RSpec, sia per imparare a conoscere BDD in generale. – Avdi

+0

Oh, e potresti essere in grado di chiamare '#and_yield()' senza argomenti. – Avdi

Problemi correlati