Когда я пишу с бизнес-логикой, мой код часто зависит от текущего времени. Например, алгоритм, который смотрит на каждый незавершенный порядок и проверяет, следует ли отправлять счет-фактуру (что зависит от количества дней с момента окончания работы). В этих случаях создание счета-фактуры не инициируется явным действием пользователя, а фоновым заданием.Как изменить дату/время в Python для всех модулей?
Теперь это создает проблему для меня, когда дело доходит до тестирования:
- я могу проверить создание счета-фактуры сам легко
- Однако трудно создать заказ в тесте и убедитесь, что на фоне работы определяет правильные заказы в правильное время.
До сих пор я нашел два решения:
- В испытательной установке, рассчитать задание даты по отношению к текущей дате. Недостаток: код становится довольно сложным, поскольку больше нет явных дат. Иногда бизнес-логика довольно сложна для краевых случаев, поэтому становится трудно отлаживаться из-за всех этих относительных дат.
- У меня есть собственные функции доступа к дате/времени, которые я использую на протяжении всего кода. В тесте я просто установил текущую дату, и все модули получают эту дату. Поэтому я могу смоделировать создание заказа в феврале и проверить, что счет-фактура создается в апреле легко. Даунсайд: сторонние модули не используют этот механизм, поэтому очень сложно интегрировать + протестировать их.
Второй подход был более успешным для меня в конце концов. Поэтому я ищу способ установить время возвращения модулей времени и времени Python. Обычно установить дату достаточно, мне не нужно устанавливать текущий час или секунду (хотя это было бы неплохо).
Есть ли такая утилита? Есть ли (внутренний) Python API, который я могу использовать?
Какую версию Python вы проверили, попробуйте это? Я только что пробовал 2,6 на MacOS 10.6, а datetime.datetime.now() блаженно не знает об изменении времени. Time –
Malcolm, я только что тестировал Python 2.7.1 на Windows и работает точно так, как показано выше. , Возможно, это зависит от платформы, и это не удивительно. –
Я тестировал это на Ubuntu 12.04 с Python 2.7.3, и он не работает. После обезглавливания 'time.time' с' mytime', как описано, вызов 'datetime.datetime.now' по-прежнему возвращает текущее время. – djsmith