2009-10-16 8 views
8

J'ai ce code:Rspec Mocks: simulation/rendement du bloc à partir d'un appel de méthode

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

je peux se moquer de l'SSH.Start utilisant cadre de simulation du RSpec comme ça, pour me dire que je suis a commencé la session SSH:

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

cela me dit si j'ai @ lancé la session SSH. maintenant je dois me moquer du ssh.exec! méthode, qui est assez facile:

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

mais comment puis-je céder/appeler le bloc qui contient le ssh.exec! appel de méthode, puisque je me suis moqué de la méthode SSH.start? Il y a probablement une méthode simple que je peux appeler pour exécuter ce bloc, mais je ne sais pas ce que c'est et je ne peux pas trouver de très bonnes explications/documentation sur le cadre moqueur de rspec.

Répondre

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

Je ne sais pas pourquoi vous avez besoin de mettre @started, puisque le should_receive vérifie que la méthode a été appelée.

+0

ne savais pas que sur should_receive ... y at-il une bonne documentation sur ce genre de choses? mon google-fu me manque ... aussi - et si je ne me soucie pas de la valeur de retour du bloc cédé? Je veux juste qu'il soit exécuté, de sorte que je puisse appeler should_receive sur le ssh.exec! méthode. –

+0

C'est ce que 'should_receive' signifie: s'il n'est pas reçu, le test échouera. En ce qui concerne la documentation, le RSpec Book est excellent. Je le recommande à la fois pour apprendre à utiliser RSpec, et pour en apprendre plus sur BDD en général. – Avdi

+0

Oh, et vous pourrez peut-être appeler '#and_yield()' sans argument. – Avdi

Questions connexes