使用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)属于过度包装,反而可能引发意外行为,直接Mockdatetime.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
相关产品推荐
相关产品推荐

