2009-08-02 4 views
3

Я испытываю какое-то странное поведение в Moq - несмотря на то, что я настраиваю макет объекта на определенный путь, а затем вызываю метод в точном Точно так же в объекте, который я тестирую, он реагирует так, как будто метод никогда не вызывался.Ожидание на Mock Object не кажется удовлетворительным (Moq)

У меня есть следующие действия контроллера, что я пытаюсь тест:

public ActionResult Search(string query, bool includeAll) 
{ 
    if (query != null) 
    { 
     var keywords = query.Split(' '); 
     return View(repo.SearchForContacts(keywords, includeAll)); 
    } 
    else 
    { 
     return View(); 
    } 
} 

Мой код модульного тестирования:

public void SearchTestMethod() // Arrange 
    var teststring = "Anders Beata"; 
    var keywords = teststring.Split(' '); 
    var includeAll = false; 
    var expectedModel = dummyContacts.Where(c => c.Id == 1 || c.Id == 2); 
    repository 
     .Expect(r => r.SearchForContacts(keywords, includeAll)) 
     .Returns(expectedModel) 
     .Verifiable(); 

    // Act 
    var result = controller.Search(teststring, includeAll) as ViewResult; 

    // Assert 
    repository.Verify(); 
    Assert.IsNotNull(result); 
    AssertThat.CollectionsAreEqual<Contact>(
     expectedModel, 
     result.ViewData.Model as IEnumerable<Contact> 
    ); 
} 

где AssertThat это просто класс моей с кучей (поскольку класс Assert не может быть расширен с помощью методов расширения ... вздох ...).

Когда я запускаю тест, он терпит неудачу на repository.Verify() линии, с MoqVerificationException:

Test method MemberDatabase.Tests.Controllers.ContactsControllerTest.SearchTestMethod() 
threw exception: Moq.MockVerificationException: The following expectations were not met: 
IRepository r => r.SearchForContacts(value(System.String[]), False)

Если удалить repository.Verify(), коллекция утверждают, не может говорить мне, что модель Возвращается null. Я отлаживал и проверял, что query != null, и что я взят в часть блока if, где выполняется код. Проблем нет.

Почему это не работает?

ответ

6

Я подозреваю, что это потому, что массив, который вы передаете в ваш издеваемый репозиторий (результат teststring.Split(' ')), представляет собой не тот объект, который фактически передается из метода поиска (результат query.Split(' ')).

Попробуйте заменить первую строку вашего кода установки с:

repository.Expect(r => r.SearchForContacts(
    It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll)) 

... который будет сравнивать каждый элемент массива, переданного в свой макет с соответствующим элементом в массиве keywords.

+0

Спасибо! Это сделало трюк сразу! =) Кажется, мне нужно прочитать Moq, а конкретно о том, когда и как использовать конструкцию It .... –

Смежные вопросы