2016-03-02 61 views
0

細算:如何測試只調用系統命令的ruby方法?

How do I stub/mock a call to the command line with rspec?

提供的答案是:

require "rubygems" 
require "spec" 

class Dummy 
    def command_line 
    system("ls") 
    end 
end 

describe Dummy do 
    it "command_line should call ls" do 
    d = Dummy.new 
    d.should_receive("system").with("ls") 
    d.command_line 
    end 
end 

我的問題是:那如何實際測試什麼?

通過製作方法,說:「叫LS系統上的命令」,然後編寫一個測試,說:「我的方法應該調用LS系統上的命令」,如何提供任何好處

如果方法發生變化,我將不得不改變測試,但我不確定我看到了額外的好處。

+1

好吧,現在想象一下,不是你改變了代碼行思路:「如果我調用'dir'而不是'ls'(或其他),他們會得到一個失敗的測試並考慮到他們自己「哦,我們期待我用那種方法叫ls,我想知道爲什麼?」你當然會在你的評論中明確表示出來;;) –

+0

另外:是的,這個給出的例子顯然是一個玩具的例子,非常簡單,幾乎不值得測試...但是大部分測試不會這麼簡單 –

+0

我問的原因是我的例子真的很簡單,我爲Capistrano實現了一個新的SCM,我的自定義SCM類有有些方法只是調用一些簡單的系統命令(相當於例如「git clone」),我可以編寫一個測試來確保「git clone」被調用,但是我沒有看到它的價值。否則在將來需要要改變這種方法,那麼他們也需要改變測試。但是測試只檢查命令是否被調用。那有意義嗎? – ardavis

回答

0

您所描述的方法被稱爲「模擬器」或「倫敦」單元測試學校。它的好處包括

  • 即構建這樣一個測試的行爲產生激勵設計單位不過於複雜的相互依賴關係的條款或條件邏輯
  • ,這樣的測試很快執行,這是非常對於大型系統的重要
  • ,這種測試可以合理地構建出以提供單位最大的覆蓋下測試
  • ,這樣的測試提供了各種各樣的「老虎鉗」在你的代碼,這樣會導致一個失敗的測試
  • 意外更改

當然,這樣的測試有其侷限性,這就是爲什麼他們經常與系統級測試配對,這些測試測試的是一起工作的單元集合是否實現了更高階的結果。