2012-05-31 3 views
3

Когда я проектирую приложения MVC, я, как правило, стараюсь почти полностью использовать логику (насколько это возможно) из своего приложения. Я пытаюсь абстрагировать это на уровень сервиса, который взаимодействует с моими репозиториями и объектами домена.Действительно ли необходимо проверить методы контроллера?

Итак, мои методы контроллера в конечном итоге выглядит примерно так:

public ActionResult Index(int id) 
{ 
    return View(Mapper.Map<User, UserModel>(_userService.GetUser(id))); 
} 

Итак, предполагая, что у меня есть хороший охват тестирования своих услуг, и мои методы действий просты как в примере выше, это излишество к единице проверить эти методы контроллера?

Если вы создаете модульные тесты для методов, которые выглядят так, какое значение вы получаете от своих тестов?

+0

Если у нас есть код и дискуссия о том, есть ли у меня тесты на единицу, то я думаю, что нет необходимости в теге * tdd * – GolfWolf

+0

Хорошая точка. Исправлена. –

+1

Кстати, с AutoMapper2 вам не нужно включать общий аргумент типа источника, только тип назначения. Поэтому вы могли бы переписать свое действие следующим образом: 'return View (Mapper.Map (_userService.GetUser (id)));' ... но если вы это сделали, и не было никаких модульных тестов для него, как бы вы могли поведение оставалось прежним? Ручной тест? – danludwig

ответ

7

Если вы делаете модульные тесты для методов, которые выглядят так, какое значение вы получите от своих тестов? ?

Вы можете иметь юнит тесты, утверждающие:

  1. Это метод GetUser из _userService был вызван, передавая тот же Int, который был передан в контроллер.
  2. То, что результатом был результат ViewResult, а не PartialViewResult или что-то еще.
  3. То, что модель результата является экземпляром UserModel, а не экземпляром пользователя (который является тем, что возвращается из службы).

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

Например, если у вас возникло изменение, действие должно возвращать PartialView или JsonResult, когда запрос является асинхронным/ajax. В контроллере было бы не так много кода, но ваши модульные тесты, скорее всего, не сработали, как только вы изменили код, потому что, скорее всего, вы не издевались над контекстом контроллера, чтобы указать, является ли запрос ajax. Таким образом, это затем говорит вам расширить свои модульные тесты, чтобы поддерживать утверждения о правильности.

Определенно добавленная стоимость ИМО для 3 очень простых методов, которые не должны занимать больше двух минут, чтобы писать.

+2

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

+2

@ Dmitry, разве это не было бы единичным тестом метода root/bootstrapper композиции, а не тестом контроллера/блока действий? – danludwig

+1

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

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