Используйте Moq для проверки правильности изменения списка в объекте. - PullRequest
1 голос
/ 11 мая 2011

Я пытаюсь добавить Moq к своим тестам в MSTest, чтобы проверить части моего кода.

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

  • Сервис -> этот сервис извлекает список объектов и помещает его в модель (я использую Mock (Moq) для возврата значений))

  • Модель -> Объект сущности с некоторыми общими свойствами и списком документов

  • Вид -> Интерфейс, который реализует мой usercontrol для общенияк ведущему.для этого представления также используется moq.

  • Presenter -> объект для извлечения модели из службы и назначения этой модели свойству представления.

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

//Setup AccountsPayableService Mock
_mockedDocumentService = new Mock<IDocumentService>();
DocumentModel<InvoiceDocumentRow> model = new DocumentModel<InvoiceDocumentRow>();
List<InvoiceDocumentRow> invoices = new List<InvoiceDocumentRow>();
InvoiceDocumentRow row = new InvoiceDocumentRow();
row.BillingMonth = DateTime.Now;
invoices.Add(row);
model.Documents = invoices;
_mockedDocumentService.Setup(service => service.GetInvoiceDocumentList(It.IsAny<DateTime>(), It.IsAny<DateTime>(), _user)).Returns(model);

//Setup View Mock
_mockedView = new Mock<IInvoicesView>();

//Setup Presenter to be tested
_presenter = new FooPresenter(_mockedDocumentService.Object);
_presenter.SetView(_mockedView.Object);

//Act

//These events will make the presenter do the call to the service and assign this to the view property
_mockedView.Raise(view => view.Init += null, new EventArgs());
_mockedView.Raise(view => view.FirstLoad += null, new EventArgs());

//Assert
_mockedDocumentService.Verify(aps => aps.GetInvoiceDocumentList(from, changedTo, _user), Times.Once());
_mockedView.VerifySet(view => view.DocumentList = model);

Этот тест выполняется и работает отлично.

однако у меня также есть случай, когда докладчик должен отфильтровать некоторые результаты, полученные от службы, и назначить подмножество для представления.По какой-то причине я не могу заставить это работать.

По сути, это точно такой же тестовый код, за исключением того, что используется другой метод на презентере, который извлекает данные из службы, фильтрует их и затем передает их обратно.к представлению.

когда я делаю утверждение для свойства представления, как я делал раньше:

_mockedView.VerifySet(view => view.DocumentList.Documents = filteredModel.Documents);

я получаю ошибку:

System.ArgumentException: Expression is not a property setter invocation.

Чтоя делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 09 июня 2011

Я нашел решение моей собственной проблемы.

Я заменяю verifySet на обычный assert объект _mockedviw.object, поэтому я использую заглушку для проверки вместо макета, и это работает отлично.чтобы использовать функциональность заглушки, которую я использовал:

_mockedView.SetupAllProperties();

Невозможно сравнить 2 разных эталонных объекта по умолчанию, поэтому я просто проверяю свойства вручную.

0 голосов
/ 11 мая 2011

Это не работает, потому что FilterModel.Documentos находится в другом контексте.Ваше представление не получает это, получает другой список, полученный от некоторого метода фильтрации.

Немного изменив вашу структуру, я предложу создать методы расширений и, очевидно, протестировать их.Таким образом, вы можете просто положить list.FilterByName("Billy");

Итак, вы создадите что-то вроде:

public static IEnumerable<ObjectFromVdCruijsen> FilteredByNome(this IEnumerable<ObjectFromVdCruijsen> enumerable, string name){
    if (!string.IsNullOrEmpty(name)){
            enumerable = enumerable.Where(s => s.Name.ToUpperInvariant().Contains(name.ToUpperInvariant()));
    }
    return enumerable;
}
...