我正在编写一个利用当前时间(通过datetime.datetime.now()
)
为了调试目的,有没有办法覆盖此调用以便它返回特定的时间戳?
作为一个后备,我可以编写一个函数,它将被调用而不是datetime.datetime.now()
并返回所需的任何内容(producton中的实际当前时间和调试时所需的测试时间)但是可能有更多的pythonic方式执行这些行动?
答案 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`.