В настоящее время я устанавливаю основу для приложения ASP.Net MVC и изучаю, какие именно юнит-тесты я должен быть готов написать. Я видел во многих местах людей, которые по сути говорили: «Не беспокойтесь о проверке ваших представлений, здесь нет логики, и она тривиальна и будет охвачена интеграционным тестом».
Я не понимаю, как это стало принятой мудростью. Интеграционные тесты служат совершенно другой цели, чем модульные тесты. Если я что-то сломаю, я не хочу знать, через полчаса, когда мои интеграционные тесты прерываются, я хочу знать это немедленно.
Пример сценария. Допустим, мы имеем дело со стандартным приложением CRUD с сущностью Customer. У клиента есть имя и адрес. На каждом уровне тестирования я хочу убедиться, что логика поиска клиента правильно получает и имя, и адрес.
Для модульного тестирования репозитория я пишу интеграционный тест для базы данных. Для модульного тестирования бизнес-правил я выполняю макет репозитория, передаю соответствующие данные бизнес-правил и проверяю, возвращаются ли мои ожидаемые результаты.
Что я хотел бы сделать: чтобы выполнить модульное тестирование пользовательского интерфейса, я макетирую бизнес-правила, настраиваю свой ожидаемый экземпляр клиента, отображаю представление и проверяю, что представление содержит соответствующие значения для указанного мной экземпляра.
То, что я застрял, делая: для модульного тестирования репозитория я пишу интеграционный тест, настраиваю соответствующий логин, создаю необходимые данные в базе данных, открываю браузер, перехожу к клиенту и проверяю, что полученная страница содержит соответствующую значения для экземпляра, который я указал.
Я понимаю, что есть два совпадения между двумя сценариями, рассмотренными выше, но главное отличие - это время и усилия, необходимые для настройки и выполнения тестов.
Если я (или другой разработчик) удаляю поле адреса из представления, я не хочу ждать, пока интеграционный тест обнаружит это. Я хочу, чтобы он был обнаружен и помечен в модульном тесте, который проводится несколько раз в день.
У меня такое ощущение, что я просто не понимаю какую-то ключевую концепцию. Может кто-нибудь объяснить, почему нежелательно получать немедленные отзывы о достоверности представления MVC? (или если не плохо, то не ожидаемый способ получения упомянутой обратной связи)
"To unit-test the repository, I write an integration test"
Чего ждать? Это не модульный тест хранилища. Вы автоматизируете тест для него, но тестируемый код все еще включает DAL и базу данных. Для модульного тестирования репозитория вы должны изолировать его, как и для своих бизнес-правил.