2013-11-20 46 views
3

我有一個數據庫操作對象作爲我的UUT(Unit Under Test)的依賴關係。因此,我想將它作爲一個嚴格的模擬,因爲我還想確保UUT不會調用任何其他可能導致db更改的方法。Rhino Mocks'Expect'with FakeItEasy

在犀牛嘲笑我做了以下內容:

  1. 我做了一個strictmock從db對象
  2. 我做了.Expect子句中安排
  3. 我叫VerifyAllExpectations在斷言

但是,當我想在FakeItEasy中執行此操作時,我無法找到無代碼複製的方法。我試着把CallsTo()+ MustHaveHappened()部分放在Arrange中,但是然後我的測試失敗了。如果我在Assert中放置了CallsTo()+ MustHaveHappened()部分,那麼我的測試也會失敗,因爲意外調用了嚴格假。這可以在沒有將CallsTo調用到Arrange和Assert的情況下完成嗎?

+0

UUT = Unit Under Test? –

+0

是的,UUT =正在測試的單元 –

+0

我明白了,謝謝。我以前沒有聽說過這個詞。我通常使用SUT - 被測系統。 –

回答

5

可以實現與以下驗證:

var service = A.Fake<IService>(); 

testedObject.CallService("data"); 

// verify your specific call to .PostData 
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once); 
// verify that no more than 1 call was made to fake object 
A.CallTo(service).MustHaveHappened(Repeated.Exactly.Once); 

A.CallTo(object)超載使您可以在所有的通用設置/驗證和假冒對象方法的任何

+0

+1這工作。供參考我已經調查了FIE所有者,看看是否有更加優雅的方式來解決這個問題https://github.com/FakeItEasy/FakeItEasy/issues/198 –

+0

我回答@AdamRalph有一個「爲什麼不只是吮吸'()=> service.PostData ...)'變成一個變量並在排列和斷言中使用它仍然是兩個調用,就像在這個答案中一樣,但是(我認爲)稍微更加慣用的FIE。 –

6

雖然從@jimmy_keen答案就可以了(我甚至upvoted它)更習慣使用FakeItEasy的是:

// Arrange 
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls 
A.CallTo(() => service.PostData("data")).DoesNothing(); // allow a specific call 

// Act 
testedObject.CallService("data"); 

// Assert 
A.CallTo(() => service.PostData("data")).MustHaveHappened(Repeated.Exactly.Once); 

--- UPDATE ---

與@blairconrad幫助在https://github.com/FakeItEasy/FakeItEasy/issues/198#issuecomment-29145440我認爲這是做到這一點的最簡單的方法,沒有重複:

// Arrange 
var service = A.Fake<IService>(o => o.Strict()); // only allows configured calls 
var expectedCall = A.CallTo(() => service.PostData("data")); 
expectedCall.DoesNothing(); // allow the call 

// Act 
testedObject.CallService("data"); 

// Assert 
expectedCall.MustHaveHappened(Repeated.Exactly.Once); 
+0

「這可以不用把CallsTo調用成Arrange和Assert?「 我知道這個版本,我的問題正是關於避免這種情況。 –

+0

你有一點關於代碼重複的問題。目前沒有辦法通過嚴格的僞造代碼來實現這一點,而沒有代碼重複。我已經在FakeItEasy上重新開放了這個問題,以進一步討論https://github.com/FakeItEasy/FakeItEasy/issues/198#issuecomment-29138957 –

+0

哇,所以CallTo返回一個「通話對象」,以後可以驗證。有趣的,upvoted。 –