2009-10-16 48 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") 

不知道爲什麼你需要設置@started,因爲should_receive驗證該方法被調用。

+0

不知道關於should_receive ...有沒有關於這個東西的任何好的文檔?我的谷歌福正在失敗我... 也 - 如果我不在乎收益塊的返回值?我只是希望它被執行,以便我可以在ssh.exec上調用should_receive!方法。 – 2009-10-16 20:11:23

+0

這就是'should_receive'的含義:如果沒有收到,測試將失敗。 至於文檔,RSpec書是優秀的。我推薦它學習使用RSpec,以及一般學習BDD。 – Avdi 2009-10-17 01:40:27

+0

噢,你也許可以在沒有參數的情況下調用'#and_yield()'。 – Avdi 2009-10-17 01:41:19