2009-10-16 17 views
8

からブロックをもたらす:RSpecのモック:モック/私はこのコードを持っているメソッド呼び出し

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

を私がしたことを私に教えて、このようにRSpecののモックフレームワークを使用してSSH.Startを模擬することができますSSHセッションを開始しました:

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

これは、私がSSHセッションを開始したかどうかを教えてくれます。今私はssh.execをモックする必要があります!方法は簡単です:

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

しかし、私はどのように降伏するかssh.execを含むブロックを呼び出しますか?私はSSH.startメソッドを嘲笑しているので、メソッド呼び出し?おそらく私はこのブロックを実行するために呼び出すことができるいくつかの簡単なメソッドがありますが、私はそれが何であるか分かりませんし、rspecの模擬フレームワークに関する本当に良い説明/ドキュメントを見つけることができません。

答えて

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

ないあなたはshould_receiveは、メソッドが呼び出されていることを確認するために、@startedを設定する必要がある理由を確認してください。

+0

これについてshould_receiveについて知りませんでした。私のgoogle-fuは私に失敗しています... また、私は降伏したブロックの戻り値を気にしませんか?私はそれを実行したいので、ssh.execのshould_receiveを呼び出すことができます!方法。 –

+0

これは 'should_receive'が意味することです。受信しなければ、テストは失敗します。 ドキュメントに関する限り、RSpecブックは優れています。私は、RSpecの使用を学ぶことと、一般的なBDDについて学ぶことの両方をお勧めします。 – Avdi

+0

ああ、あなたは引数なしで '#and_yield()'を呼び出すことができるかもしれません。 – Avdi

関連する問題