代码之家  ›  专栏  ›  技术社区  ›  Tomas Vana

如何绕过RhinoMocks mock中方法的执行?

  •  3
  • Tomas Vana  · 技术社区  · 16 年前

    我使用Rhinomock进行一个非常简单的测试(我必须说我是一个初学者)。我试图这样嘲笑我的对象

    var mock = MockRepository.GenerateMock<MyClass>();
    

    创建助手存根:

    var stubLinkedObject = MockRepository.GenerateStub<MyClass>();
    

    然后执行一些应该调用该方法的逻辑 AddLink 班上的 MyClass 用我的存根论点。在测试结束时,我简单地断言这个方法实际上是用

    mockAction.AssertWasCalled(a => a.AddLink(stubLinkedObject));
    

    我注入了正确的依赖项,并实际调用了该方法。然而,问题是 真实的 类名

    mockAction.Stub(a => a.AddLink(null)).IgnoreArguments().Do(null);
    

    在执行之前,但这似乎不起作用(我只得到一些例外)。有什么想法,也许还有解释为什么mock会执行方法逻辑?

    2 回复  |  直到 16 年前
        1
  •  4
  •   dh.    16 年前

    我试着复制。这是对我来说很好用的代码

    [Test]
    public void Test()
    {
        var classMock = MockRepository.GenerateMock<MyClass>();
        var linkedMock = MockRepository.GenerateStub<MyClass>();
    
        classMock.Expect(c => c.MyMethod(linkedMock));
    
        classMock.MyMethod(linkedMock);
    
        classMock.AssertWasCalled(c => c.MyMethod(linkedMock));
    }
    
    public class MyClass
    {
        public virtual void MyMethod(MyClass linkedClass)
        {
            Console.WriteLine("MyMethod is called");
        }
    }
    
        2
  •  3
  •   Grzenio    16 年前

    只有当方法AddLink是虚拟的时,您的方法才会起作用,否则.Net运行时将始终运行真正的实现(这是正确的)。

    通常最佳实践是在执行依赖注入时使用接口(因此您的类需要IMyClass而不是MyClass)。这样,使用模拟框架就容易多了——不仅您不必记住让所有方法都是虚拟的,而且您还避免了将正确的参数传递给MyClass的构造函数的问题(在现实世界中这是一件痛苦的事情)