Должен ли я использовать AutoMapper в своих модульных тестах?

Я пишу модульные тесты для методов контроллера ASP.NET MVC.

Эти контроллеры имеют зависимость от IMapper - интерфейса, который я создал для абстрактного AutoMapper, переданного через инсталляцию конструктора с помощью Castle Windsor.

В методах действий используется IMapper для сопоставления объектов домена с объектами ViewModel и обратно, целью которых является сохранение СУБДЫХ и сохранение методов действий лаконично.

В моих модульных тестах, должен ли я

  • Настройте AutoMapper с правильными привязками (они создаются с использованием профилей AutoMapper, которые можно тестировать и повторно использовать между веб-сайтами и unit test) и передать это как правильную реализацию AutoMapper IMapper.

  • Передача макетных объектов (я использую Moq) для экземпляра IMapper, в зависимости от теста (это означало бы дублирование некоторой работы в тестовом установочном коде, чтобы убедиться, что объекты, возвращенные из mock mapper относятся к объектам, которые макетщик отображает для отображения).

  • Hand-configure AutoMapper с помощью только сопоставлений, которые, я думаю, мне понадобятся для каждого теста (много работы и средств, я не тестирую сопоставления, которые действительно будут использоваться).

Каково мнение об использовании кода инфраструктуры в модульных тестах? В какой момент это станет интеграционным тестом (т.е. Тестированием интеграции AutoMapper и моих контроллеров)?

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

2 ответа

Я мог бы согласиться с № 2. Вы знаете, что Automapper работает, вы знаете, что ваши инъекционные работы (получили тесты на это право?:-)). Я бы больше сосредоточился на специфике, вещах, которые не просто SomeClass.Property = AnotherClass.Property. ЭТИ специальные случаи следует тестировать не основные функции копирования. Не тестируйте фреймворк.

Что касается большего тестового кода, я чувствую, что все в порядке. Тесты должны быть настроены в рамках заданных тестов (также в пределах разумного) только для данной единицы.

Что касается Moq, синтаксис прост, не переусердствуйте. var obj = new Mock(); затем установите свои свойства как obj.Setup(x = > x.Property). Возвращает ( "привет" ), если у вас нет более конкретной проблемы? Moq также установил все свойства на нем, так что вам может даже не понадобиться automapper

-edit- нашел его, он obj.SetupAllProperties();


Я за # 2, как jeriley

Добавление в Moq, если вам нужно вернуть объект на основе переданных ему значений, вы можете написать свою настройку так:

mockObject.Setup(x => x.MapObject(It.IsAny())
 .Returns((ProductDto productDto) => 
 {
 var product = new Product()
 {
 Id = productDto.Id,
 Name = productDto.Name
 };
 return product
 });

Немного беспорядочно, но удобно.

licensed under cc by-sa 3.0 with attribution.