Я понимаю ваш вопрос следующим образом: у вас есть функция check
, которую вы считаете сложной для тестирования из-за ее зависимости от problem_report
. Чтобы сделать его лучше тестируемым, вы скопировали код в тестовый файл. Вы будете тестировать скопированный код, потому что вы можете изменить его, чтобы его было проще тестировать. И вы хотите знать, имеет ли этот подход смысл.
Ответ - нет, это не имеет смысла. Вы проверяете не реальную функцию, а совершенно другой код. Ну, код может не начать полностью отличаться, но в скором времени копия и оригинал будут отличаться, и это будет кошмар обслуживания, чтобы гарантировать, что копия всегда напоминает оригинал. Совершенствование кода для тестируемости - это отдельная история: вы можете внести изменения в функцию check
, чтобы улучшить ее тестируемость. Но тогда в тесте и в рабочем коде должна использоваться одна и та же результирующая функция.
Как лучше проверить функцию check
тогда? Во-первых, вы уверены, что использование оригинальных объектов problem_report
не может быть разумно использовано в ваших тестах? (Вот несколько критериев, которые помогут вам решить: Что подделать для тестовых случаев Python? ). Теперь давайте предположим, что вы пришли к выводу, что вы не можете разумно использовать оригинал problem_report
.
В этом случае интерфейс достаточно прост, чтобы определить макет problem_report
. Имейте в виду, что Python использует типизацию утили, поэтому вам нужно всего лишь создать класс, в котором есть links
член, который имеет метод items()
. Кроме того, вашему высмеянному problem_report
классу нужен метод get_correction()
. Кроме того, ваш макет не должен производить типы, которые похожи на типы, используемые problem_report
. Метод items()
может просто возвращать список списков, например [["a",2],["xxxxdetailCorrectionxxxx",4]]
. Тот же аргумент справедлив для get_correction
, который может, например, просто вернуть свой аргумент или производное значение, например, его отрицательное значение.
Для приведенного выше примера (items()
возвращает [["a",2],["xxxxdetailCorrectionxxxx",4]]
и get_correction
возвращает отрицательный аргумент) ожидаемый результат будет {4: -4}
. Не нужно имитировать реальные correction
объекты. И вы можете создавать свои смоделированные версии problem_report
без необходимости считывать данные из файлов - макеты могут быть полностью настроены из кода модульного тестирования.