Rhino Mock Expect.Call()实际上调用该方法不仅创建了一个期望

时间:2015-07-07 12:37:21

标签: unit-testing nunit rhino-mocks

我想测试是否在测试中调用了一个方法。

我的问题是,当我想要创造期望时,它并没有像我想象的那样工作。下一行实际上运行方法,不仅创建期望:

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);

2 个答案:

答案 0 :(得分:1)

通常,当您设置PartialMockStub时,Expect会调用真实方法,这意味着方法中缺少virtual关键字。

确保Service.MethodThatIExpectToRunvirtual

答案 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: