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

Pytest中datetime模拟报错:int与MagicMock无法比较的解决方法

解决pytest模拟datetime.now时的TypeError问题

错误原因:
你patch了整个datetime类,导致测试函数中datetime(2016, 5, 20, 14, 10, 0)的调用实际返回的是MagicMock对象,而非真实的datetime实例。被测试函数中time.hour获取的是MagicMock类型,无法与整数进行比较,因此触发TypeError。


方案1:仅mock datetime.now方法

只patch被测试函数中用到的datetime.now方法,保留datetime类的其他功能,这样可以正常创建真实的datetime实例:

修改后的测试代码:

def test_get_time_of_day(mocker):
    # 仅patch datetime.now方法,路径对应被测试函数所在模块的datetime引用
    mock_now = mocker.patch("tests.test_sample.datetime.now")
    # 设置mock返回真实的datetime实例
    mock_now.return_value = datetime(2016, 5, 20, 14, 10, 0)
    
    assert get_time_of_day() == "Afternoon"

方案2:mock整个datetime类并模拟hour属性

如果需要patch整个datetime类,可以直接模拟时间对象的hour属性,无需创建真实datetime实例:

修改后的测试代码:

def test_get_time_of_day(mocker):
    mock_datetime = mocker.patch("tests.test_sample.datetime")
    # 创建mock时间对象,设置hour为14
    mock_time = mocker.Mock()
    mock_time.hour = 14
    # 让datetime.now返回这个mock对象
    mock_datetime.now.return_value = mock_time
    
    assert get_time_of_day() == "Afternoon"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:22