python - 单元测试时模拟 datetime.datetime.now()

标签 python datetime

@pytest.mark.parametrize("test_input,expected_output", data)
def test_send_email(test_input, expected_output):
    emails = SendEmails(email_client=MagicMock())
    emails.send_email = MagicMock()
    emails.send_new_email(*test_input)
    emails.send_email.assert_called_with(*expected_output)

我正在寻找在 send_new_email 方法中调用的模拟 datetime.datetime.now()。但是我不确定该怎么做。

我尝试创建一个新的日期时间对象

 datetime_object = datetime.datetime.strptime('Jun 1 2017  1:33PM', 
                                          '%b %d %Y %I:%M%p')

然后覆盖 datetime.datetime.now

datetime.datetime.now = MagicMock(return_value=datetime_object)

但是,我得到了错误

TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

这个问题被标记为 Python 的副本:Trying to mock datetime.date.today() but not working

Python: Trying to mock datetime.date.today() but not working

我已经尝试过这个解决方案,但我无法让它发挥作用。由于项目要求,我无法安装 freezegun。

我在测试文件中创建了一个新类

class NewDate(datetime.date):
@classmethod
def today(cls):
    return cls(2010, 1, 1)
datetime.date = NewDate

但我不知道如何让 SendEmails 类使用它。

最佳答案

你可以替换整个类(class):

_FAKE_TIME = 0
class _FakeDateTime(datetime.datetime):
    @staticmethod
    def now():
        return _FAKE_TIME

然后使用它:

_FAKE_TIME = whatever
datetime.datetime = _FakeDateTime

该类需要一些改进,例如比较运算符,以使 FakeDateTime 可与日期时间进行比较,但它应该可以工作。

关于python - 单元测试时模拟 datetime.datetime.now(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47413871/

相关文章:

python - 如何在 Django 中提供可下载的 zip 文件

PHP 选择日期等于日期时间的位置

java - 比较日期列表并找到最接近分钟的日期,然后选择它并将其四舍五入到最接近的分钟

python - 使用 Python SDK 加速生成 Dropbox 可共享链接的大量请求?

python - 在 Python 中使用尾随逗号连接或打印列表元素

python - 可以在 Ubuntu 中使用 cx-freeze 将 python 脚本卡住为 Windows 可执行文件吗?

python - 比较 pandas 中的日期时间的最快方法是什么?

python - 在字典中临时保留键和值

php - 无法将 DateTime 对象保存到 MySQL 中的日期时间字段

python - 如何将 twitter API v2 时间戳解析为 python 日期时间