2011-05-19 38 views

回答

7

這是大多數文章的參考,非常通用的和清晰的解釋:

http://martinfowler.com/articles/mocksArentStubs.html

一言以蔽之:

存根提供罐裝答案在測試過程中的呼叫 ,通常不 響應在所有外 什麼什麼編程進行測試。 存根也可能記錄有關呼叫的信息 ,例如電子郵件網關 存根,它記錄「發送」它的消息,或者可能只有多少個「發送」的消息 。

而且

嘲笑的對象是預編程與 預期形成他們 有望獲得該呼叫的 規範。

+1

我明白了,所以當你想確保一個對象以特定的方式被調用時使用mock ...和存根解答存根。 – Blankman 2011-05-19 17:21:56

1

本文提供和問問題來自不同的背景。關於Rspec的境界,RSpec的書的作者寫的CH 14.1:

「要創建雙,只需使用double()方法,像這樣:

thingamajig_double = double('thing-a-ma-jig') 

...還有stub()mock()方法,其產生相同類型的對象的:

stub_thingamajig = stub('thing-a-ma-jig') 
mock_thingamajig = mock('thing-a-ma-jig') 

我們可以用這些來使該規範更清楚在適當的時候」 (重點煤礦)後

作者還包括一段代碼在CH 14.3 -

describe Statement do 
    it "logs a message on generate()" do 
    customer = stub('customer') 
    customer.stub(:name).and_return('Aslak') 
    logger = mock('logger') 
    statement = Statmement.new(customer, logger) 

    logger.should_receive(:log).with(/Statement generated for Aslak/) 

    statement.generate 
    end 
end 

,然後寫上「通過使用mock()方法來生成記錄儀雙和stub()方法來生成客戶雙,我們正在幫助表達這些對象扮演不同的角色的例子「。 (重點煤礦)

這些代碼段和解釋,使我相信,儘管福勒先生在他的文章中得出的概念行是好的畫,有stub()mock()(或double()之間沒有功能差異,就此而言)在Rspec。可能是錯誤的,但我沒有檢查過文檔。

0
stub: 

A fake object that returns a pre-determined value for a method call. 
Actual object is not called. 


Stubs and mocks often used interchangeably. 
Mean two different things. 
But people generally refer to "Mock Object Frameworks" 

Product.stub(:find_by_title).with('orange').and_return(Product.new(:title=>"orange", :price=>6.23)) 

Mocks: 

Just like Stubs, but with an expectation to be (or not to be) called. 

Test will fail if the mock is (or isn't) called. 

Used in the same way as stubs, 

Product.should_receive(:find_by_title).with('orange').exactly(2).and_return(Product.new(:title=>"orange", :price=>6.23)) 

To know more about mock and stub please refer this article, 
http://www.ibm.com/developerworks/web/library/wa-mockrails/index.html 
相關問題