2010-02-08 29 views
3

我使用RhinoMocks进行一个非常简单的测试(我必须说我是初学者)。我试图嘲弄我的对象这样如何绕过RhinoMocks模拟中的方法执行?

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

创建一个帮助存根:

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

然后执行一些逻辑应该与我的存根参数调用该方法的类MyClassAddLink。在测试结束时,我简单地断言,这种方法实际上是调用

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

我注入了正确的依赖和方法实际上是调用。但是,问题在于MyClass中的real实现被调用并导致崩溃,因为某些逻辑不能执行(链接集合不可用等)。我怎样才能绕过执行并简单地检查一个方法是否被调用?我试过类似的东西

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

在我进入执行前,但这似乎并没有工作(我只有一些例外)。任何想法和可能解释为什么模拟执行方法逻辑呢?

+1

你的方法AddLink是虚拟的吗? – 2010-02-08 09:19:49

+0

不,它不是,可能是这个问题:) – 2010-02-08 13:41:35

+1

我很困惑。通常情况下,应该有一个被测试类的对象实例没有被模拟/存根。你似乎只有嘲笑和存根。模拟和存根仅用于在测试过程中需要控制的协作者对象。 – 2010-02-08 15:53:41

回答

4

我试过重现。这是这对我来说

[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"); 
    } 
} 
+0

这可能会起作用。谢谢;) – 2010-02-08 14:22:55

+1

像这个问题,这个答案让我困惑。你用'AssertWasCalled'(用于布置 - 执行断言中的断言阶段)混合'Expect'(用于record-replay-verify中的记录阶段)。你不应该在同一个测试中混合两种方法。 – 2010-02-08 23:11:52

+1

这是使用Rhino Mocks 3.5进行嘲讽的新模式。从MockRepository.GenerateMock()和MockRepository.GenerateStub()返回的Mocks/stub以重放模式返回,并且不需要显式移动到重放模式。看看这里http://www.ayende.com/Wiki/Rhino+Mocks+3.5.ashx#MockingwithandwithoutaninstanceofMockRepository – 2010-02-09 07:42:12

3

你的方法工作得很好,只会工作,如果你的方法AddLink是虚拟的代码,否则.NET运行时将始终运行真正的实现(这是正确的)。

通常最好的做法是在进行依赖注入时使用接口(所以你的类需要IMyClass而不是MyClass)。这样,使用模拟框架就容易多了 - 不仅不必记住所有方法都是虚拟的,而且避免了将正确参数传递给MyClass的构造函数的问题(在现实世界中这是一个痛苦)

相关问题