2009-08-18 33 views
2

我在使用Rhino Mocks模擬的界面中擁有一個屬性。我想知道它是否在我的單元測試中被訪問過。我可以告訴我是否已經通過Rhino Mocks訪問過一個屬性

有沒有辦法查看是否通過Rhino Mocks訪問了該房產?

我發現這個代碼here,但它似乎並沒有工作:

string name = customerMock.Name; 
customerMock.AssertWasCalled(x => {var ignored = x.Name;}); 

我轉載此代碼,我得到如下:

Rhino.Mocks.Exceptions.ExpectationViolationException: IAddAddressForm.get_FirstName(); Expected #1, Actual #0.. 

我想用這個語法,但我肯定錯過了什麼。我用一個存根(不是模擬)來稱呼它有什麼影響嗎?

回答

1

原來我使用的語法確實有效。但只有當屬性不處於PropertyBehavior模式時纔有效。 (這是存根的默認值,可以打開模擬)。

一旦PropertyBehavior模式打開,那麼該語法不起作用。根據Ayende你必須檢查在這一點的價值。

0

我相信StrictMock是你正在尋找的。有一些關於它的信息here。據說它的使用是令人沮喪的,因爲它可能使測試過於脆弱,但它應該可以幫助你實現你想要做的事情。

0

您可以使用StackFrame類來檢查調用堆棧。不是很乾淨,但它應該給出想要的結果...

0

我通常使用Moq它使用城堡,所以你可能會考慮它,而不是與Rhino Mocks一起。這是你如何能做到這有:

// expects an invocation to set the value to "foo" 
mock.SetupSet(foo => foo.Name = "foo"); 

// or verify the setter directly 
mock.VerifySet(foo => foo.Name = "foo"); 
3

有沒有辦法,看看屬性 經犀牛嘲笑訪問?

是的。您可以設置該物業的預期。如果驗證不拋出,那麼你就知道該屬性被訪問:

var mocks = new MockRepository(); 
IFoo foo = mocks.DynamicMock<IFoo>; 
// this sets up an expectation that Name is accessed, and what it should return 
Expect.Call(foo.Name).Return("John Doe"); 
mocks.ReplayAll() 

// test something that uses IFoo here ... 

mocks.VerifyAll(); // Throws if foo.Name was not accessed after ReplayAll() 

這一切都是假設你想foo.Name進行訪問。如果你的目標是驗證它是而不是訪問,那麼你應該只使用StrictMock而不是DynamicMock。嚴格的模擬會拋出任何意外的電話。

1

如果你想斷言一個方法被調用或者一個被僞造對象訪問的屬性,你應該總是使用一個模擬。存根適用於不想測試交互的情況,但只需確保對某個對象的調用返回特定值以使邏輯流動。

相關問題