Сформулирую вопрос на конкретном примере.
Пусть для того, чтобы контроллер (MVC только для примера, вопрос не связан с какой-либо конкретной технологией) вернул необходимые данные, нужно проделать следующее:
1. Извлечь данные из хранилища.
2. Отфильтровать их.
3. Отсортировать.
4. Выделить страницу для отображения (пагинация).
Каждое из этих четырёх элементарных действий очень просто покрыть модульными тестами.
Но всё равно где-то должен быть код, который вызовет эти методы последовательно и сформирует данные для передачи на Presentation Layer.
Вопрос: где должен располагаться этот код?
1. Если в контроллере, мы получаем лёгкость тестирования бизнес-логики, но при этом Толстый Тупой Уродливый Контроллер (т.к. в нём бизнес-логика).
2. Если мы такой метод создадим в слое бизнес-логики, то он будет публичным, а элементарные методы -- приватными. И т.к. мы должны тестировать только публичные методы (API класса), то нам нужно писать тесты на этот всеобъемлющий метод, что является адским адом.
Где должен быть этот код (в контексте модульного тестирования)?
Привет! Если нужно оттестить всю последовательность вместе (пункты 1-4), то я бы использовал функциональные тесты, а не модульные. Они как раз и нужны для того, чтобы тестировать как работает фича в целом.