是什麼模擬和存根之間的差異,他們似乎都非常相似,我呢?使用RSpec的,困惑,一個模擬和存根對象之間的區別?
這將是很好,如果有人能夠給出時使用的一個真實的例子,或者是他們互換,但沒有想什麼時候使用一個模擬或短線的最佳做法?
是什麼模擬和存根之間的差異,他們似乎都非常相似,我呢?使用RSpec的,困惑,一個模擬和存根對象之間的區別?
這將是很好,如果有人能夠給出時使用的一個真實的例子,或者是他們互換,但沒有想什麼時候使用一個模擬或短線的最佳做法?
這是大多數文章的參考,非常通用的和清晰的解釋:
http://martinfowler.com/articles/mocksArentStubs.html
一言以蔽之:
存根提供罐裝答案在測試過程中的呼叫 ,通常不 響應在所有外 什麼什麼編程進行測試。 存根也可能記錄有關呼叫的信息 ,例如電子郵件網關 存根,它記錄「發送」它的消息,或者可能只有多少個「發送」的消息 。
而且
嘲笑的對象是預編程與 預期形成他們 有望獲得該呼叫的 規範。
本文提供和問問題來自不同的背景。關於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。可能是錯誤的,但我沒有檢查過文檔。
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
我明白了,所以當你想確保一個對象以特定的方式被調用時使用mock ...和存根解答存根。 – Blankman 2011-05-19 17:21:56