协助为犀牛嘲笑的方法编写单元测试

时间:2011-11-25 23:04:25

标签: c# unit-testing testing tdd rhino-mocks

我需要一些帮助,使用Rhino Mocks 3.5编写下一课的单元测试。我班上的以下重写方法:

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

        this.Notify(data);
    }

我想编写一个测试来验证在调用Initialize方法时,该方法调用Notify方法并且具有ViewData类型的参数。另外,我想检查在此方法中是否调用了作为私有方法的GetName方法。我使用访问器来访问GetName私有方法。

由于我不熟悉编写测试并需要帮助,所以任何帮助都会很棒。

2 个答案:

答案 0 :(得分:3)

您想要的是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();
}

答案 1 :(得分:0)

虽然没有直接回答你关于如何使用Rhino的问题(看起来Jon已经做了相当不错的工作),为了后人,我将展示如何使用手动模拟来测试它。 (忍受我,自从我做完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

希望有所帮助!

布兰登