我有一个只应在特定对象的属性设置为false时调用的方法。这是它的初始值。第一次调用后,该属性设置为true,确保只进行一次调用。
但是,当我模拟执行此更改的类时,模拟对象不会更改基础对象的属性。
是否有办法强制更改对象上的属性是对满足期望的响应?
有些事情......
Expect.Call(mockedObject.TestMethod(underlyingObject)).NowDoThis(delegate() { underlyingObject.Processed = true; });
答案 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);