如何覆盖当前时间?

2024-09-29 23:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

为了调试的目的,有没有一种方法可以覆盖这个调用,以便它返回一个特定的时间戳?在

作为一种回退,我可以编写一个函数来代替datetime.datetime.now(),并返回所需的任何内容(producton中的实际当前时间和调试时所需的测试时间),但是有没有更python的方法来执行这些操作?在


Tags: 方法函数目的应用程序利用内容datetime时间
2条回答

大体上,你的选择是:

  • 使用^{} library,它可以动态地将函数替换为一个总是给出相同结果的伪函数(或者使用另一个执行相同操作的模拟库)。这意味着您不必修改您的函数;然而,理性的人可能不同意使用mock进行monkey补丁是否是一个好的实践,即使对于调试也是如此。我认为这是Python中使用最广泛的解决方案。在
  • 根据环境(系统上的实际环境变量、全局状态或其他内容)修改函数以执行不同的操作。这是最简单的方法,但也是最粗糙和最脆弱的方法,因此您必须确保在调试完成后将其更改回原处。在
  • 修改您的函数以接受一个函数本身作为参数,并在正常操作中将datetime.datetime.now作为该函数传入,但是传入一些不同的(例如stub)进行测试。在

您可以使用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`.

相关问题 更多 >

    热门问题