2014-12-08 3 views
2

MOQ Я метод как этот:Убедитесь, что расширение Linq методы называются с

public IEnumerable<string> GetCompaniesCities() 
    { 
     return CompanyRepository.All() 
         .OrderBy(c => c.City) 
         .Select(c => c.City.ToUpper()) 
         .Distinct().ToList(); 
    } 

Как я могу проверить (с использованием MOQ), что OrderBy (c => c.City) называется? И Select(c => c.City.ToUpper() и Distinct()?

Я получаю

Invalid проверить на невиртуальном (переопределение в VB) член:. Х => x.All() OrderBy (с => c.City)

Примечание: это тестовый модуль, а не интеграционный тест, так что я не собираюсь БД

+3

Не проверяйте внутренние элементы, как это, но проверьте, возвращает ли метод то, что он должен, и находится ли он в правильном порядке. –

+0

Проблема в том, что это единичный тест, а не интеграционный тест, поэтому я не собираюсь на db – polonskyg

+3

Это не способ избежать теста интеграции. Вы должны издеваться над репозиторием и вводить в него свои данные в памяти (посмотрите на инъекции зависимостей и рамки, такие как единство и ninject). –

ответ

3

Вы бы не проверить, что OrderBy вызывается, это гораздо легче просто проверить, что строки возвращаются приказал. Т.е., с NUnit:

Assert.That(sut.GetCompaniesCities(), Is.Ordered); 

Также с Moq вас can't test that an extension method like OrderBy is called, это просто не возможно.


Для решения комментария о не в состоянии идти в базу данных, вы правы, что насмешливый вашу зависимость избавляет от необходимости идти в базу данных. Но вы можете высмеивать их возвращаемые значения, чтобы вы могли имитировать, как будто они сделали попали в базу данных. Так вот, ваше хранилище зависимость, и вы бы издеваться All() возвращать список несортированных значений:

var companiesUnsorted = new Company[] { 
    new Company { City = "Xyz" }, 
    new Company { City = "Abc" } 
}; 
var mockRepository = new Mock<ICompanyRepository>(); 
mockRepository.Setup(p => p.All()).Returns(companiesUnsorted); 

var sut = new WhateverClassYourCodeSampleIsFrom(mockRepository.Object); 

Тогда вы просто выполнить утверждение выше.

+0

Проблема в том, что это единичный тест, а не интеграционный тест, поэтому я не собираюсь работать с db – polonskyg

+0

Это нормально, предположительно вы настраиваете свой репозиторий для возврата списка, правильно? Просто '.All()' возвращает список в неупорядоченном порядке и проверяет, что вывод 'GetCompaniesCities()' сортируется. Не требуется взаимодействие db ... –

+0

@polonskyg См. Мое обновление. –

0

Вы не можете этого сделать просто потому, что moq не может mock методы расширения. И это потому, что moq использует наследование, которое у метода расширения не имеет

0

Что вы хотите сделать, это Moq the CompanyRepository object Все методы в вашем модульном тесте. Внесите CompanyRepository Moq в класс, содержащий метод GetCompaniesCities().

Затем заполните Moq соответствующим образом и проверите тестовое тестирование модуля. Метод GetCompaniesCities() возвращает ожидаемый результат. Вам все равно, как GetCompaniesCities кодируется только, что возвращает правильное значение.

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