Unit testing Rhino Mock Expect.Call()实际上调用该方法,而不仅仅是创建一个期望
我想测试测试中是否调用了一个方法 我的问题是,当我想要创造期望时,它并没有像我想的那样起作用。下一行实际运行该方法,而不仅仅是创建期望:Unit testing Rhino Mock Expect.Call()实际上调用该方法,而不仅仅是创建一个期望,unit-testing,nunit,rhino-mocks,Unit Testing,Nunit,Rhino Mocks,我想测试测试中是否调用了一个方法 我的问题是,当我想要创造期望时,它并没有像我想的那样起作用。下一行实际运行该方法,而不仅仅是创建期望: Expect.Call(() => mockedService.MethodThatIExpectToRun(params)); 还有另一种方法: mockedService.Expect((s=> s.MethodThatIExpectToRun(params))); 但这实际上也运行了该方法,不仅创建了一个期望,以通过测试来实现 这一行断言
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);
IService mockedService=MockRepository.GeneratePartialMock(mockedRepository_1,…,mockedRepository_n);
更一般(尽管可能不太有用)的注释:部分模拟可能指向测试代码的设计气味。如果您只想为一个类的一部分提供期望值,那么该类的职责可能太多,应该划分为多个类?这样,您就可以清晰地隔离责任/协作者,而不需要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");
}
}
通常,当您在设置
存根
或Expect
时调用real方法的PartialMock
时,这意味着方法中缺少virtual
关键字
确保ExpectToRun的
Service.method是virtual
什么是mockedService的运行时类型?它是Rhinomock创建的动态模拟对象吗?你是在模仿一个接口还是一个具体的类?它是一个partialMock。我需要向它传递一些模拟存储库,并且需要存根服务类的一些方法。我还刷新了这个问题。“部分模拟将调用在类上定义的方法,除非您为该方法定义期望值。”因此,如果您定义该方法,则不应调用原始实现。感谢您的支持,但我发现我的方法没有标记为虚拟,这就是问题所在。您提到的最后一行”(不过,请注意,一旦解决了对方法的所有期望,该方法将被路由回实现)实际上是说,如果你为一个调用设置了一个期望值,并且发生了两个调用,那么第二个调用将转到实际的实现,而不是模拟的实现。糟糕的是,我对文档的解释是错误的(显然我没有亲自测试)。但是,PartialMock指向可能的设计问题的观点仍然存在。
Real object:
REAL IMPLEMENTATION
Mocked object: