如何覆盖当前时间?

WoJ*_*WoJ 5 python time datetime

我正在编写一个利用当前时间的应用程序(通过datetime.datetime.now()

出于调试目的,有没有办法覆盖此调用,以便它返回特定的时间戳?

作为后备方案,我可以编写一个函数,该函数将被调用datetime.datetime.now(),而不是返回所需的任何内容(生产中的实际当前时间和调试时所需的测试时间),但可能有一种更Pythonic的方式来执行这些操作?

And*_*ter 7

一般来说,您的选择是:

  • 使用unittest.mock,它可以用总是给出相同结果的虚拟函数来动态替换该函数(或使用另一个执行相同操作的模拟库)。这意味着您不必修改您的函数;然而,理性的人可能会不同意使用模拟进行猴子修补是否是一个好的实践,即使对于调试也是如此。我认为这是Python中针对这个问题最广泛使用的解决方案。
  • 修改您的函数以根据其环境(系统上的实际环境变量、全局状态或其他内容)执行不同的操作。这是最简单的方法,但也是最粗暴、最脆弱的方法,所以你一定要在调试完成后把它改回来。
  • 修改您的函数以接受函数本身作为参数,并datetime.datetime.now在正常操作中作为该函数传入,但传入不同的东西(例如存根进行测试。