這可以通過方法進行如下:存根Rhino.Mocks屬性設置器在被調用時執行一個動作?
myStub.Stub(x => x.SomeMethod()).WhenCalled(x => do something);
有沒有什麼辦法的時候屬性setter叫同樣的事情可以做什麼?
這可以通過方法進行如下:存根Rhino.Mocks屬性設置器在被調用時執行一個動作?
myStub.Stub(x => x.SomeMethod()).WhenCalled(x => do something);
有沒有什麼辦法的時候屬性setter叫同樣的事情可以做什麼?
下面的工作:
Expect.Call(myStub.MyProperty).WhenCalled(p => Console.WriteLine("Called")).Return("Test result");
請注意,如果你的屬性(MyProperty
在這種情況下)被宣佈虛擬這僅適用。
謝謝彼得。我還需要做些什麼才能做到這一點?我總是使用AAA語法,所以我沒有關於記錄/重放的經驗,如果是這樣的話。當我嘗試這種方式時,我得到一個'InvalidOperationException'「當模擬對象處於重播狀態時,此操作無效。」另外,我是否設置了一個基本上是'void'方法(property setter)的返回值? – Jay 2010-11-07 13:19:11
是的。你要做的事情如下:1.記錄你的期望(如答案)2.調用'mocks.ReplayAll()'其中mocks是'MockRepository'的一個實例3.執行你的測試4.調用'mocks.VerifyAll )'。當一個或多個期望沒有得到滿足時,最後一個將會「拋出」。如果您省略了最後一次通話,則不會進行檢查。 – 2010-11-07 13:21:11
我沒有Visual Studio中得心應手,但我相信的東西沿着這些路線應該工作:
myStub.Stub(x => x.SomeProperty = null).WhenCalled(x => do something);
這正是我所嘗試的,但它沒有工作,即使添加.IgnoreArguments()後。它編譯並運行正常,但從不調用WhenCalled表達式。 – 2010-12-21 13:24:27
這對我有用。 – 2012-05-03 17:29:44
把模擬回「記錄」模式,並使用舊的記錄/回放語義設置對於屬性setter的期望:
stub.BackToRecord();
Expect.Call(stub.SomeProperty).SetPropertyAndIgnoreArgument().WhenCalled(p => ...do something...);
stub.Replay();
所以彼得和帕特里克已經給出了正確的答案,但如果你喜歡用開箱的更完整的例子也許有助於。所以在這裏,它是:
[Test]
public void Test()
{
var fakedInterface = MockRepository.GenerateMock<ISite>();
// Stub property setter and call own lambda when invoked.
fakedInterface.BackToRecord();
Expect.Call(fakedInterface.Name).SetPropertyAndIgnoreArgument().WhenCalled(a =>
{
Assert.That(a.Arguments.Length, Is.EqualTo(1));
Assert.That(a.Arguments[0], Is.EqualTo("abc"));
// Stub property getter with provided value.
fakedInterface.Stub(x => x.Name).Return((String)a.Arguments[0]);
});
fakedInterface.Replay();
// Set the property (and let our above lambda be invoked)
fakedInterface.Name = "abc";
// Get the property (the value that was freshly stubbed within the lamba.
var result = fakedInterface.Name;
Assert.That(result, Is.EqualTo("abc"));
}
在這個例子中的下一個訣竅是,返回值將拉姆達內存根,以便您能夠調用/測試任何你在二傳手,並在接下來的喜歡你可以通過普通的屬性獲取器來獲得這個值。
我知道這有點舊,但所有的答案都有點不清楚。 從那時起,Ayende就處理這個問題的一節討論了新的和新的構造,如果我再次找到它,我認爲這可能會有所幫助。
添加了兩個用於期待設置屬性的構造。 之前已經可以使用Rhino.Mocks,但是在流暢的界面語法中沒有存在具有表達能力的結構 。
屬性設置期望具有一定值等 這樣指定:
Expect.Call(mockedCustomer.Name).SetPropertyWithArguments( 「Ayende」);
僅用於測試的相互作用,一個屬性設置期望 沒有指定值完成這種方式:
Expect.Call(mockedCustomer.Name).SetPropertyAndIgnoreArguments();
這些新構建物是等於:使用(mocks.Record()){mockedCustomer.Name = 「Ayende」
; //設置一個 期望設置一個特定的參數。
LastCall.IgnoreArguments(); //我們可以忽略這個 期望的參數,並且讓我們期望設置 屬性,而不管實際值如何。}
周杰倫,你有沒有找到一個AAA解決方案呢? – 2010-12-21 13:22:40