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

Rhino Mock Expect.Call() actually calls the method not only create an expectation

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

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

Expect.Call(() => mockedService.MethodThatIExpectToRun(params));

还有一个方法:

mockedService.Expect((s=> s.MethodThatIExpectToRun(params)));

但这实际上也运行了该方法,不仅创建了要通过测试实现的期望。

而断言方法是否未被调用的这一行实际上也调用了该方法,不仅检查它是否被调用。

mockedService.AssertWasCalled(s=> s.MethodThatIExpectToRun((params)));

补充信息: MethodThatIExpectToRun returns void

对于 prgmtc 的评论:

IService mockedService = MockRepository.GeneratePartialMock<Service>(mockedRepository_1, ..., mockedRepository_n);

一个更一般的(尽管可能不太有用)的评论:部分模拟可以指向被测代码的设计味道。如果你只想为class的一部分提供期望,那么也许那个class的职责太多,应该拆分成多个class?这样你就可以干净地隔离 responsibilities/collaborators 并且不需要 partialmock 构造。如果您模拟(不是部分模拟)具体的接口或虚拟成员 class,则调用将不会进入实际实现。

例如:

        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: 

通常当你有 PartialMock 在设置 StubExpect 时调用真正的方法,这意味着方法中缺少 virtual 关键字。

确保 Service.MethodThatIExpectToRunvirtual