协助编写单元测试与犀牛模拟的方法

问题描述:

我需要一些帮助,为使用Rhino Mocks 3.5的以下课程编写单元测试。在我的课下overrided方法:协助编写单元测试与犀牛模拟的方法

public override void Initialize(params object[] messages) 
    { 
     var data = new ViewData 
     { 
      Name = this.GetName() 
     }; 

     this.Notify(data); 
    } 

我想编写一个测试来验证,当初始化方法被调用时,方法调用的通知方法,具有类型的ViewData的参数。另外我想检查一下这个方法中调用的是一个私有方法的GetName方法。我使用访问者来访问GetName私有方法。

,因为我是新来编写测试和需要帮助任何帮助将是巨大的与此有关。

+0

'Notify()'做了什么方法?它是否以某种方式访问​​在此类中注入的其他类? – sll

+0

GetName()和Notify()是什么签名?如果Notify只接受ViewData,则不需要编写单元测试来验证该参数的类型为ViewData - .NET将在编译时为您执行该操作。 – PatrickSteele

你想要什么叫做partial mock

[Test] 
public void UsingPartialMocks() 
{ 
    MockRepository mocks = new MockRepository(); 
    YourClass partialMock = mocks.PartialMock<YourClass>(); 
    Expect.Call(partialMock.Notify(null)).IgnoreArguments(); 
    mocks.ReplayAll(); 
    partialMock.Initialize(null); 
    mocks.VerifyAll(); 
} 
+0

感谢您的帮助乔恩,但当我尝试上述我得到的错误:无效的调用,最后的调用已被使用或没有调用(确保您调用虚拟(C#)/ Overridable(VB)方法)。 notify方法不是在被测试的类中实现的,而是在由我正在测试的类继承的基类中实现的。任何想法可能是什么问题? – amateur

+0

您可以尝试使用lambda语法 - 请参阅http://*.com/questions/1301116/rhino-mocks-error-invalid-call-the-last-call-has-been-used-or-no-call- has-be –

+0

我将上面的行更改为Expect.Call(()=> partialMock.Notify(null))。IgnoreArguments();但仍然遇到同样的错误 - 任何想法? – amateur

虽然没有直接回答你关于如何使用犀牛做的问题(似乎乔恩在这个已经做了体面的工作),为子孙后代着想,我会告诉我如何使用手动嘲讽测试。 (多多包涵,它已经有一段时间,因为我做了C#,所以原谅了语法错误)

[Test] 
public void initializeRegistersViewDataWithGivenName() 
{ 
    ShuntedYourClass yourClass = new ShuntedYourClass(); 
    yourClass.initialize(/* arg list */); 

    // Verify 'Notify' was called 
    Assert.NotNull(yourClass.registeredViewData); 

    // Verify 'GetName' private method was invoked and 
    // 'Name' was properly populated 
    Assert.AreEqual("expected name", yourClass.registeredViewData.Name); 
} 

// Nested class for testing purposes only. 
class ShuntedYourClass : public YourClass 
{ 
    public ViewData registeredViewData; 

    public override void Notify(ViewData vd) 
    { 
    this.registeredViewData = vd; 
    } 
} 

此代码现在验证Initialize方法确实正常工作和执行Notify用适当的参数。

希望有帮助!

Brandon