2011-09-07 76 views

回答

16

你可以把一個模擬(或雙)是假的對象。當你正在測試並需要使用一個在你的測試中不易使用的對象時,你可以使用一個模擬來近似你如何期望這個對象的行爲和解決方法。存根可以以類似的方式使用,但可以在對象上使用單獨的方法。

下面是一個使用都不少的虛構的例子:

class Client 
    def connect_to_server 
    if Server.connect.status == 'bad' 
     show_an_error 
    else 
     do_something_else 
    end 
    end 
    def do_something_else; end 
    def show_an_error; end 
end 

context "failure" do 
    it "displays an error" do 
    bad_network_response = double("A bad response from some service", :status => 'bad') 
    Server.should_receive(:connect).and_return(bad_network_response) 

    client = Client.new 
    client.should_receive(:show_an_error) 
    client.connect_to_server 
    end 
end 

你可以想像,使用了很多嘲笑或磕碰的是一個壞主意;這基本上掩蓋了測試中的部分代碼,但對於一些困難/罕見的測試場景來說,這是一個簡單的解決方案。

Factory Girl對於生成測試數據很有用。您可能會使用工廠作爲用於爲您的模型創建實例的配方,您可能需要測試涉及大量測試數據的事情,這可能會導致使用fixtures不起作用並且明確創建複雜對象的情況可能會很乏味。

+1

我可能是錯的,但我認爲你在方法上存在錯誤。你可以有存根對象或模擬對象,或者存根方法或模擬方法。不同的是你如何使用它們。存根(stub)只是讓測試工作而不實際調用另一個依賴關係。 Mock也是這樣做的,但調用是必需的,也是測試的一部分。你可能有一個虛假的對象,既有存根也有嘲笑。 Rspec甚至稱它們爲「雙」而不是模擬。 – fregas

15

你的第一站是Martin Fowler的著名的文章:Mocks are not Stubs

編輯

MocksStubs兩種類型Test Doubles(Mezaros術語)的。測試雙擊通常用於模擬被測系統(或被測類)所需的依賴關係,以便SUT/CUT可以獨立於其依賴關係進行測試。 (買者 - 精確術語可以是相當通過Jeff here提到一個敏感的問題例如)

維基百科:

實例

  • 存根方法可能只是返回一個常數值w母雞被SUT叫來,例如用於開展SUT的特定測試案例。
  • *Mockito(Java)和Moq(.Net)這樣的框架允許您用最少的代碼在運行中針對依賴項的接口構建模擬類,並提供驗證SUT是否與模擬正確交互的功能,例如通過檢查SUT用正確的參數調用模擬方法的正確次數。

*免責聲明 - 我不是一個Ruby開發

+6

當你閱讀完這篇文章後,你可以進入[製作TDD的嘲弄](http://avdi.org/devblog/2011/09/06/making-a-mockery-of-tdd/) –