如何覆盖当前时间?

时间:2014-06-29 07:26:31

标签: python datetime time

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

的应用程序

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

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

2 个答案:

答案 0 :(得分:4)

从广义上讲,您的选择是:

  • 使用unittest.mock library,它可以使用虚拟函数替换动态函数,该函数始终提供相同的结果(或使用另一个执行相同操作的模拟库)。这意味着您不必修改您的功能;然而,合理的人可能会不同意使用mock进行猴子修补是否是好习惯,即使是调试也是如此。我认为这是Python中使用最广泛的解决方案。
  • 修改您的函数以根据其环境(系统上的实际环境变量,全局状态或其他内容)执行不同的操作。这是最简单的方法,也是最粗暴,最脆弱的方式,因此您必须确保在调试完成后将其更改回来。
  • 修改您的函数以接受函数本身作为参数,并在正常操作中传递datetime.datetime.now作为该函数,但传入不同的函数(例如stub)进行测试。

答案 1 :(得分:1)

您可以使用mock库来模拟datetime.datetime.now()用法:

import mock

def my_test():
    my_mock = mock.Mock(return_value=your_desired_timestamp)

    with mock.patch('mymodule.datetime.datetime.now', my_mock):
        # Here, all calls to `datetime.datetime.now` referenced by `datetime.datetime`
        # defined in `my_module` will be mocked to return `your_desired_timestamp`.