【问题标题】:Rhino Mock Expect.Call() actually calls the method not only create an expectationRhino Mock Expect.Call() 实际上调用的方法不仅是创建一个期望
【发布时间】:2015-07-07 12:37:20
【问题描述】:

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

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

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

【问题讨论】:

  • mockedService的运行时类型是什么?它是由 RhinoMocks 创建的动态模拟对象吗?你是在模拟一个接口还是一个具体的类?
  • 它是一个partialMock。我需要将一些模拟存储库传递给它,并且我需要对服务类的一些方法进行存根。我也刷新了这个问题。

标签: unit-testing nunit rhino-mocks


【解决方案1】:

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

确保Service.MethodThatIExpectToRunvirtual

【讨论】:

    【解决方案2】:

    更笼统的(虽然可能不太有用)评论:部分模拟可以指向被测代码的设计气味。如果您只想为类的一部分提供期望,那么也许该类的职责太多,应该拆分为多个类?这样您就可以清楚地隔离职责/协作者,并且不需要 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: 
    

    【讨论】:

    • “部分模拟将调用类上定义的方法,除非您为该方法定义了期望。”所以如果你定义它不应该调用原来的实现。
    • 感谢您的支持,但我发现我的方法没有标记为虚拟,这是问题所在。
    • 您所指的最后一行“(但请注意,一旦解决了对方法的所有期望,该方法将被路由回实现)”实际上是说,如果您为单个调用设置了期望并且发生了两个调用,第二个调用将转到实际实现,而不是模拟的调用..
    • 我的错,我错误地解释了文档(并且显然没有为自己测试)。然而,partialmocks 指向可能的设计问题的观点仍然存在。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多