2009-03-04 110 views
2

我有一個方法只能在特定對象的屬性設置爲false時調用。這是它的初始值。第一次通話後,該屬性設置爲true,以確保該通話只能進行一次。在RhinoMocks的Expect.Call中可以設置對象的屬性值嗎?

但是,當我嘲笑執行此更改的類時,模擬對象不會更改基礎對象的屬性。

有沒有辦法強制對象屬性的變化是對符合期望的響應?沿線的

東西...

Expect.Call(mockedObject.TestMethod(underlyingObject)).NowDoThis(delegate() { underlyingObject.Processed = true; }); 

回答

3

是,

,而不是你NowDoThis()調用嘗試DO()


終於回家了,所以我可以嘗試一些代碼。

訣竅是投匿名委託鍵入從System.Delegate derrives行動(類型MethodInvoker也應該工作,但該類型只在System.Windows.Forms的可用)

下面的代碼。我更喜歡rhino mocks AAA語法。讓我知道是否必須將其轉換爲Expect.Call語法。我還使用xunit.net,[事實]只是意味着[測試]

public interface Thingie 
{ 
    bool Flag { get; set; } 
    void DoSomething(); 
} 

[Fact] 
public void Test() 
{ 
    var thingie = MockRepository.GenerateStub<Thingie>(); 

    thingie.Stub(x => x.DoSomething()).Do((Action) delegate { thingie.Flag = true; }); 

    Assert.False(thingie.Flag); 

    thingie.DoSomething(); 

    Assert.True(thingie.Flag); 
} 
+0

嗯。當我這樣做時,我收到一個錯誤,「無法將匿名方法轉換爲鍵入'System.Delegate',因爲它不是委託類型」。 – BlackWasp 2009-03-04 14:11:05

0

假設mockedObject,其實,一個模擬對象,你可以簡單地設置你的財產返回值的測試方法有後被稱爲:

bool isProcessed = false; 
Expect.Call(mockedObject.TestMethod(underlyingObject)) 
    .Do(new Action(() => isProcessed = true)); 

SetupResult.For(mockedObject.Processed).Return(isProcessed); 
相關問題