Когда я пишу с помощью бизнес-логики, мой код часто зависит от текущего времени. Например, алгоритм, который смотрит на каждый незавершенный порядок и проверяет, следует ли отправлять счет-фактуру (что зависит от количества дней с момента окончания работы). В этих случаях создание счета-фактуры не инициируется явным действием пользователя, а фоновым заданием.
Теперь это создает проблему для меня, когда дело доходит до тестирования:
- Я могу легко протестировать создание счета-фактуры.
- Однако сложно создать заказ в тесте и проверить, что задание фона определяет правильные заказы в нужное время.
До сих пор я нашел два решения:
- В тестовой настройке вычислите даты работы относительно текущей даты. Недостаток: код становится довольно сложным, поскольку больше нет явных дат. Иногда бизнес-логика довольно сложна для краевых случаев, поэтому становится трудно отлаживаться из-за всех этих относительных дат.
- У меня есть собственные функции доступа к дате/времени, которые я использую во всем моем коде. В тесте я просто установил текущую дату, и все модули получают эту дату. Поэтому я могу смоделировать создание заказа в феврале и проверить, что счет-фактура создается в апреле легко. Downside: сторонние модули не используют этот механизм, поэтому очень сложно интегрировать + протестировать их.
Второй подход был для меня более успешным. Поэтому я ищу способ установить время возвращения Python datetime + модулей времени. Обычно установить дату достаточно, мне не нужно устанавливать текущий час или секунду (даже если это было бы хорошо).
Есть ли такая утилита? Есть ли (внутренний) Python API, который я могу использовать?