如何使用RhinoMocks和mbunit在函数中测试新对象

时间:2013-12-18 14:50:58

标签: c# vb.net unit-testing rhino-mocks mbunit

我正在尝试使用RhinoMocks和MbUnit测试以下方法但是我无法通过测试。当前错误是找不到期望的“”。

该功能在vb.net中,测试在c#

 Public Function Login(user As Website.BusinessObjects.User) As Integer Implements IActivityLog.Login

        Dim item As BOAudit.IActivityLog = New BOAudit.ActivityLog(_request)

        ' Activity
        item.UserID = User.GuidID
        item.Type = Enums.ActivityType.Login
        item.Description = String.Format(If(IsAdmin, "Logged in as {0}", "Logged in"), User.FullName)
        item.EventUserID = _authenticatedUser.GuidID

        Return _dalActivityLog.Save(item)

    End Function

下面的测试是我目前的测试,我认为问题在于在上面的函数中声明一个新对象而不是将该对象传递给函数。测试上述函数的最佳方法是什么?我应该传入对象吗?

[Test]
    public void Login_Data_NewRecordCreated()
    {
        const int id = 99;
        var data = new Website.CodeModules.BusinessObjects.Audit.ActivityLog(_request)
        {
            Type = Enums.ActivityType.Login,
            Description = "Logged in",
            EventUserID = _user.GuidID
        };

        var user = _mocks.StrictMock<User>();

        using (_mocks.Record())
        {
            Expect.Call(_dalActivityLog.Save(data)).Return(id);
        }

        using (_mocks.Playback())
        {
            var result = _balActivityLog.Login(user);

            Assert.AreEqual(id, result);
        }

    }

1 个答案:

答案 0 :(得分:1)

你在测试中断言的条件似乎没有多大意义。您的代码似乎测试_dalActivityLog中的mock实例返回您设置的常量。

在该测试中,您应该测试函数Login的代码,而不是_dalActivityLog实现。因此,您应该检查是否使用正确的参数传递了_dalActivityLog.Save。

我认为_dalActivityLog是一个类的实例,它实现了一个你未在问题中指定的接口。我们称之为IActivityLog。然后你应该在测试代码中设置它的模拟实例。

IActivityLog logMock = MockRepository.GenerateStub<IActivityLog>();

然后你以某种方式将这个mock实例注入到具有Login方法的类的实例中(通过构造函数或属性)。

然后调用Login方法并传递User

的实例

然后你就_dalActivityLog.Save调用做出断言,如下所示。

logMock.AssertWasCalled(
  call => call.Save(
    Arg<Website.CodeModules.BusinessObjects.Audit.ActivityLog>.Matches(
      logItem => logItem.UserID == user.GuidID && logItem.Type == Enums.ActivityType.Login
    )
  )
);