Тест контроллера должен проверить алгоритмы кода в ваших методах действий, а не на вашем уровне данных. Это одна из причин издеваться над этими службами данных. Контроллер ожидает получить определенные значения из репозиториев/сервисов/etc и действовать по-разному, когда получает от них различную информацию.
Вы пишете модульные тесты, чтобы утверждать, что контроллер ведет себя очень определенным образом в очень специфических сценариях/обстоятельствах. Уровень данных - это одна часть приложения, которая предоставляет эти обстоятельства методам управления/действия. Утверждение, что метод службы вызван контроллером, ценен, потому что вы можете быть уверены, что контроллер получает информацию из другого места.
Проверка типа возвращаемой модели просмотра является ценной, поскольку, если возвращается неправильный тип viewmodel, MVC будет генерировать исключение во время выполнения. Вы можете предотвратить это в производстве, выполнив единичный тест. Если тест не удался, тогда представление может вызвать исключение в производстве.
Ед. Испытания могут быть полезными, поскольку они делают рефакторинг намного проще. Вы можете изменить реализацию и утверждать, что поведение по-прежнему остается неизменным, убедившись, что все модульные тесты проходят.
Ответа на комментарий # 1
При изменении реализации методы испытуемых вызовов для изменения/удаления метода нижнего слоя издевался, то тестовый модуль также должен измениться. Однако это не должно происходить так часто, как вы думаете.
Типичный рабочий процесс red-green-refactor требует для написания ваших модульных тестов до написания методов, которые они тестируют. (Это означает, что в течение короткого промежутка времени ваш тестовый код не будет компилироваться, и поэтому многие молодые/неопытные разработчики с трудом принимают красный зеленый рефактор.)
Если вы сначала напишите свои юнит-тесты, вы придете к точка, в которой вы знаете, что контроллеру необходимо получить информацию с более низкого уровня. Как вы можете быть уверены, что он пытается получить эту информацию? Избавьтесь от метода нижнего уровня, который предоставляет информацию, и утверждая, что метод нижнего уровня вызывается контроллером.
Возможно, у меня есть оговорка, когда я использовал термин «изменение реализации». Когда метод действия контроллера & должен быть изменен, чтобы изменить или удалить издеваемый метод, вы действительно меняете поведение контроллера.Рефакторинг, по определению, означает изменение реализации без изменения общего поведения и ожидаемых результатов.
Red-green-refactor - это подход к обеспечению качества, который помогает предотвратить ошибки & дефектов в коде, прежде чем они появятся. Обычно разработчики меняют реализацию, чтобы удалить ошибки после их появления. Поэтому, чтобы повторить, случаи, о которых вы беспокоитесь, не должны происходить так часто, как вы думаете.
Я согласен с большей частью того, что вы говорите, но я не понимаю, как тестовый модуль может помочь при изменении реализации (ваш последний пункт), если она требует, чтобы реализация вызывала определенные методы нижнего уровня (вторая точка). – ChaseMedallion
Я до сих пор не согласен с идеей тестирования того, что функция вызывает другую функцию, но я понимаю, откуда вы пришли, когда вы думаете об этом с точки зрения «тестов в первую очередь». Кроме того, вы, вероятно, правы, что во многих случаях изменение в вызовах службы указывает на изменение поведения контроллера. Спасибо за очень продуманный, описательный и продуманный ответ! – ChaseMedallion