我想测试是否在测试中调用了一个方法。
我的问题是,当我想要创造期望时,它并没有像我想象的那样工作。下一行实际上运行方法,不仅创建期望:
Expect.Call(() => mockedService.MethodThatIExpectToRun(params));
还有另一种方式:
mockedService.Expect((s=> s.MethodThatIExpectToRun(params)));
但这实际上也运行了这个方法,不仅创造了测试所满足的期望。
如果未调用该方法,则断言的这一行实际上也会调用该方法,而不仅仅是检查它是否被调用。
mockedService.AssertWasCalled(s=> s.MethodThatIExpectToRun((params)));
其他信息:
MethodThatIExpectToRun
返回void
对于prgmtc的评论:
IService mockedService = MockRepository.GeneratePartialMock<Service>(mockedRepository_1, ..., mockedRepository_n);
答案 0 :(得分:1)
通常,当您设置PartialMock
或Stub
时,Expect
会调用真实方法,这意味着方法中缺少virtual
关键字。
确保Service.MethodThatIExpectToRun
为virtual
。
答案 1 :(得分:0)
更通用(尽管可能不太有用)的评论:部分模拟可以指向被测代码的设计气味。如果你只想提供对某个课程的一部分的期望,那么这个课程可能有太多的责任,应该分成多个类?这样,您就可以干净地隔离职责/协作者,而不需要使用partialmock构造。如果您模拟(不是部分模拟)具体类的接口或虚拟成员,则调用将不会进入实际实现。
例如:
Console.WriteLine("Real object: ");
new Foo().Bar();
Console.WriteLine("Mocked object: ");
var aFoo = MockRepository.GenerateMock<Foo>();
aFoo.Expect(f => f.Bar());
aFoo.Bar();
...
public class Foo
{
public virtual void Bar()
{
Console.WriteLine("REAL IMPLEMENTATION");
}
}
输出:
Real object:
REAL IMPLEMENTATION
Mocked object: