2010-11-07 45 views

回答

3

下面的工作:

Expect.Call(myStub.MyProperty).WhenCalled(p => Console.WriteLine("Called")).Return("Test result"); 

請注意,如果你的屬性(MyProperty在這種情況下)被宣佈虛擬這僅適用。

+0

謝謝彼得。我還需要做些什麼才能做到這一點?我總是使用AAA語法,所以我沒有關於記錄/重放的經驗,如果是這樣的話。當我嘗試這種方式時,我得到一個'InvalidOperationException'「當模擬對象處於重播狀態時,此操作無效。」另外,我是否設置了一個基本上是'void'方法(property setter)的返回值? – Jay 2010-11-07 13:19:11

+0

是的。你要做的事情如下:1.記錄你的期望(如答案)2.調用'mocks.ReplayAll()'其中mocks是'MockRepository'的一個實例3.執行你的測試4.調用'mocks.VerifyAll )'。當一個或多個期望沒有得到滿足時,最後一個將會「拋出」。如果您省略了最後一次通話,則不會進行檢查。 – 2010-11-07 13:21:11

1

我沒有Visual Studio中得心應手,但我相信的東西沿着這些路線應該工作:

myStub.Stub(x => x.SomeProperty = null).WhenCalled(x => do something); 
+0

這正是我所嘗試的,但它沒有工作,即使添加.IgnoreArguments()後。它編譯並運行正常,但從不調用WhenCalled表達式。 – 2010-12-21 13:24:27

+0

這對我有用。 – 2012-05-03 17:29:44

1

把模擬回「記錄」模式,並使用舊的記錄/回放語義設置對於屬性setter的期望:

stub.BackToRecord(); 
Expect.Call(stub.SomeProperty).SetPropertyAndIgnoreArgument().WhenCalled(p => ...do something...); 
stub.Replay(); 
1

所以彼得和帕特里克已經給出了正確的答案,但如果你喜歡用開箱的更完整的例子也許有助於。所以在這裏,它是:

[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")); 
} 

在這個例子中的下一個訣竅是,返回值將拉姆達內存根,以便您能夠調用/測試任何你在二傳手,並在接下來的喜歡你可以通過普通的屬性獲取器來獲得這個值。

1

我知道這有點舊,但所有的答案都有點不清楚。 從那時起,Ayende就處理這個問題的一節討論了新的和新的構造,如果我再次找到它,我認爲這可能會有所幫助。

Rhino Mocks 3.5

添加了兩個用於期待設置屬性的構造。 之前已經可以使用Rhino.Mocks,但是在流暢的界面語法中沒有存在具有表達能力的結構 。

屬性設置期望具有一定值等 這樣指定:

Expect.Call(mockedCustomer.Name).SetPropertyWithArguments( 「Ayende」);

僅用於測試的相互作用,一個屬性設置期望 沒有指定值完成這種方式:

Expect.Call(mockedCustomer.Name).SetPropertyAndIgnoreArguments();

這些新構建物是等於:使用(mocks.Record()){mockedCustomer.Name = 「Ayende」

; //設置一個 期望設置一個特定的參數。

LastCall.IgnoreArguments(); //我們可以忽略這個 期望的參數,並且讓我們期望設置 屬性,而不管實際值如何。}

相關問題