You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mock模拟datetime.datetime.now()时Pytest出现AssertionError问题排查

问题分析:Mock datetime.datetime.now() 时触发 AssertionError

问题根源

你的测试代码存在三个关键错误:

  • 未调用测试函数:assert get_print_date == FAKE_NOW 中,get_print_date 是函数对象而非执行后的返回值,必须加括号调用 get_print_date()
  • 类型不匹配:get_print_date() 返回的是格式化后的字符串,但你直接和 FAKE_NOW(datetime对象)做比较,类型完全不一致,必然断言失败
  • Mock写法冗余易出错:用 MagicMock(wraps=datetime.datetime) 属于过度包装,反而可能引发意外行为,直接Mock datetime.datetime.now 方法更简洁可靠

修正后的测试代码

方式一:使用 unittest.mock.patch

import datetime
import pytest
from unittest.mock import patch
from your_module import get_print_date  # 替换为你的函数所在模块名

FAKE_NOW = datetime.datetime(2022, 10, 21, 22, 22, 22)
EXPECTED_OUTPUT = FAKE_NOW.strftime("%d/%m/%Y %H:%M:%S")

def test_get_print_date():
    with patch('datetime.datetime.now') as mock_now:
        mock_now.return_value = FAKE_NOW
        assert get_print_date() == EXPECTED_OUTPUT

方式二:使用pytest monkeypatch Fixture

import datetime
import pytest
from your_module import get_print_date  # 替换为你的函数所在模块名

FAKE_NOW = datetime.datetime(2022, 10, 21, 22, 22, 22)
EXPECTED_OUTPUT = FAKE_NOW.strftime("%d/%m/%Y %H:%M:%S")

@pytest.fixture()
def mock_datetime_now(monkeypatch):
    def mock_now():
        return FAKE_NOW
    monkeypatch.setattr(datetime.datetime, 'now', mock_now)

def test_get_print_date(mock_datetime_now):
    assert get_print_date() == EXPECTED_OUTPUT

关键注意点

  • 必须调用函数 get_print_date(),而非直接使用函数对象做比较
  • 提前将FAKE_NOW格式化为与函数返回值一致的字符串,确保两边类型、内容完全匹配
  • Mock时直接针对datetime.datetime.now方法,比包装整个datetime类更简单,能避免不必要的复杂逻辑

内容的提问来源于stack exchange,提问作者SoulSeeker916

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:35:22