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: