2

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

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

有没有办法强制改变对象的属性以响应期望得到满足?

类似于...的东西

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

2 回答 2

3

是的,

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


终于回家了,所以我可以尝试一些代码。

诀窍是将匿名委托转换为派生自 System.Delegate 的类型 Action(类型 MethodInvoker 也应该工作,但该类型仅在 System.Windows.Forms 中可用)

这是代码。我更喜欢 rhino mocks AAA 语法。让我知道是否必须将其转换为 Expect.Call 语法。我也在使用 xunit.net,[Fact] 只是意味着 [Test]

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);
}
于 2009-03-04T12:38:40.100 回答
0

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

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

SetupResult.For(mockedObject.Processed).Return(isProcessed);
于 2009-05-04T14:51:06.247 回答