是否可以在RhinoMocks中的Expect.Call期间设置对象的属性值?

时间:2009-03-04 12:30:29

标签: rhino-mocks

我有一个只应在特定对象的属性设置为false时调用的方法。这是它的初始值。第一次调用后,该属性设置为true,确保只进行一次调用。

但是,当我模拟执行此更改的类时,模拟对象不会更改基础对象的属性。

是否有办法强制更改对象上的属性是对满足期望的响应?

有些事情......

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

2 个答案:

答案 0 :(得分:3)

是,

而不是你的NowDoThis()调用试试Do()


最后回家,所以我可以尝试一些代码。

诀窍是将匿名委托强制转换为从System.Delegate中取出的Action类型(类型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);
}

答案 1 :(得分:0)

假设mockedObject实际上是一个模拟对象,你可以在调用测试方法后为你的属性设置一个返回值:

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

SetupResult.For(mockedObject.Processed).Return(isProcessed);