【问题标题】:How to test python methods that include datetime.now() for different dates?如何测试包含不同日期的 datetime.now() 的 python 方法?
【发布时间】:2019-10-22 17:38:29
【问题描述】:

我有一些方法可以利用datetime 库中的datetime.datetime.now()。我想为这些方法编写单元测试,就好像now() 是几个不同的时间(例如,每月的第 5 天,每月的第 15 天)。

比如说我有这个方法(真的只是一个例子,我没有这样的方法)

import datetime

def days_left_this_month():
    return 30 - datetime.datetime.now().day

我想在该月的第 5 天测试该方法,即:days_left_this_month() == 25 如果now() 在该月的第 5 天。

最好的方法是什么?

【问题讨论】:

  • jmunsch 答案中的freezegun 看起来正是为此量身定制的。在设置函数返回值的更一般情况下,您修补函数路径并将模拟返回值设置为您在测试期间想要的值。

标签: python unit-testing testing


【解决方案1】:

你可以使用freezegun:

from freezegun import freeze_time
import datetime
import unittest


@freeze_time("2019-10-05")
def test():
    assert datetime.datetime.now() == datetime.datetime(2019, 10, 05)

例如测试days_left_this_month:

def days_left_this_month():
    return 31 - datetime.datetime.now().day

我们可以:

@freeze_time("2019-10-05")
def test():
    assert days_left_this_month() == 26

def test_multiple():
    with freeze_time(x):
        assert days_left_this_month() == y
    with freeze_time(x):
        assert days_left_this_month() == y
    with freeze_time(x):
        assert days_left_this_month() == y
    with freeze_time(x):
        assert days_left_this_month() == y

【讨论】:

  • 谢谢,如果我在test() 中测试一个方法,这会起作用吗?即:assert days_left_this_month() == 25?另外,我可以在整个测试方法中多次更改时间吗?
猜你喜欢
  • 2019-11-12
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2021-04-11
  • 2023-03-19
  • 2020-09-25
相关资源
最近更新 更多