2009-03-04 112 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); 
相关问题