2013-12-18 4 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

Условие, которое вы утверждаете в своем тесте, похоже, не имеет большого смысла. Ваш код, кажется, проверяет, что экземпляр mock в _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 
    ) 
) 
);