Должен ли я использовать AutoMapper в моих модульных тестах? - PullRequest
8 голосов
/ 12 января 2011

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

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

Методы действий используют IMapper для отображения из объектов домена в объекты ViewModel и обратно, с целью сохранить СУХОЙ и сохранить методы действия краткими.

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

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

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

  3. Ручная настройка AutoMapper только с отображениями, которые, я думаю, понадобятся для каждого теста (много работы и означает, что я не проверяю сопоставления, которые действительно будут использоваться).

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

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

Ответы [ 2 ]

6 голосов
/ 12 января 2011

Я мог бы согласиться с # 2. Вы знаете, что работает autopper, вы знаете, что ваша инъекция работает (получили тесты на это правильно? основные функции копирования. Не тестируйте фреймворк.

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

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

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

4 голосов
/ 12 января 2011

Я за # 2, как Джерили

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

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

               return product
           });

Немного грязно, но удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...