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
相关产品推荐
相关产品推荐

