2013-12-18 22 views
0

我想用RhinoMocks和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

您在测试中声明的条件似乎没有太大意义。您的代码似乎测试了_dalActivityLog中的模拟实例返回您设置的常量。

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

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

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

然后你以某种方式注入该模仿到例如有登录方法(通过构造函数或属性)的类的实例。

然后致电您的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 
    ) 
) 
);