Чтобы ответить на ваш второй вопрос «Нужно ли его полностью изолировать?»: Это зависит.Даже если вы проводите модульное тестирование, вам обычно не нужно изолировать свой код от всех зависимостей.Например, вы бы не изолировали свой код от math.sin()
.Я бы даже сказал, что создания тестовых двойников следует избегать, если только на это нет причины.На практике, однако, достаточно часто есть причина.
Вот некоторые критерии, которые могут помочь вам решить для вашего module_a
, беспокоит ли вас зависимость при юнит-тестировании.Все они относятся к свойствам зависимого компонента («DOC», в вашем случае module_a
), включая его транзитивные зависимости и цели тестирования:
- Можете ли вы принести DOCво все желаемые состояния / можете ли вы гарантировать, что с DOC вы действительно сможете выполнить все интересные тестовые сценарии?Если нет, лучше изолировать, чтобы вы могли проверить свой код всеми желаемыми способами.
- Вызывает ли DOC какое-либо недерминистское поведение (дата / время, случайность, сетевые подключения)?Тогда лучше изолируйте свой код, чтобы сделать тесты детерминированными.
- Вызывает ли вызов DOC недопустимо длительное выполнение теста?Если это так, изолируйте для обеспечения приемлемого времени выполнения теста.
- Имеет проблемы со стабильностью (зрелостью) DOC, которые делают тесты ненадежными по отношению к вашему компоненту, или, что еще хуже, DOC еще даже недоступен (не применимо в вашем конкретном примере)?Если это так, вам лучше изолировать (или даже просто сделать это) просто для того, чтобы ваши тесты выполнялись и предоставлять достоверные результаты по вашему собственному коду.
Но даже если приведенные выше критерии указывают на то, что зависимость вызывает беспокойствоВы: Имейте в виду, что некоторая переделка кода может быть предпочтительнее создания тестовых пар.Например, отделение вычислений от взаимодействий путем помещения каждого из них в различные функции может избавить вас от некоторых насмешек: вы проверяете вычисления с помощью модульного тестирования и взаимодействий с интеграционным тестированием.