Александр Бындю @AlexanderByndyu
Автор книг «Антихрупкость в IT» и «Карта гипотез»
Information
- Rating
- 761-st
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity
Specialization
Project Director, Chief Executive Officer (CEO)
Lead
C#
Agile
Microservices
Designing application architecture
Design patterns
SOLID
High-loaded systems
Kanban
Project management
People management
Это моя главная цель. Рад, что на пользу.
Она дает не создавать stub-объекты (class StupProductRepository: IProductRepository), а оборачивать их new Mock(). Это удобно тем, что нет лишнего кода для создания stub-объектов и возможно задавать поведение mockRepository.Setup(r => r.GetLastProduct()).Returns(new Product())
Для этого практически во всех IoC-контейнерах предусмотрена условная логика. Например, для Ninject wiki.github.com/enkari/ninject/conventions-based-binding
На счет того, чтобы тесты не пришлось перелопачивать есть хорошая книга www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054
Большое кол-во тестов действительно может стать массой, которую сложно поддерживать. Для написания хороших тестов, которые помогают, а не отягощают, надо набить руку и… шишки.
Я согласен, что надо тестировать также и с взаимодействием с базой данных, но это уже интеграционные тесты.
Вот здесь довольно известный пример www.objectmentor.com/resources/articles/xpepisode.htm
send_special_report_to_administrator_if_no_reports_created
Просто пару наводящих вопросов. Когда рефакторите вы добавляете или удаляете функциональность? Проходят ли тесты после рефакторинга? И наконец, участвует ли код приватного метода при проходе теста?
Другими словами, откуда берутся приватные методы? Сначала ведь их нет, как например в моем примере. Но вот если мы возьмем и вынесем условие reports.Count == 0 в приватный метод IsReportListEmpty()? Функциональность системы не измениться, при этом все тесты буду проходить, как и до создания метода IsReportListEmpty. При этом приватный метод будет протестирован.