跨文件Mock Django模型方法遇NotImplementedError,求排查解决
解决Mock异步方法时的NotImplementedError问题
你的测试代码里有两个关键问题导致mock没生效,从而抛出了NotImplementedError,我来一步步帮你修正:
问题1:Patch装饰器用错了位置
你把@patch装饰到了普通函数true上,而不是你的测试方法test_apply_working。这意味着这个mock完全没有参与到测试流程中,测试执行时依然会调用b.py里原始的未实现方法。
问题2:异步方法的Mock需要适配异步逻辑
原方法is_valid_trigger是用async def定义的异步方法,如果你用普通的同步函数作为mock,await调用时会报错(因为await需要可等待对象),所以要么用异步的mock函数,要么用AsyncMock来处理。
修正后的代码示例
方案1:使用AsyncMock(推荐,更简洁)
# a.py from unittest.mock import patch, AsyncMock import b from django.test import AsyncTestCase # 根据你实际使用的测试框架调整 class TriggerTest(AsyncTestCase): @patch("b.Trigger.is_valid_trigger") async def test_apply_working(self, mock_is_valid): # 设置异步mock的返回值 mock_is_valid.return_value = True # 注意:原方法需要event参数,这里传一个合适的值(比如None) result = await b.Trigger().is_valid_trigger(event=None) # 验证结果符合预期 self.assertEqual(result, True) # 验证mock被正确调用 mock_is_valid.assert_called_once_with(event=None)
方案2:自定义异步mock函数
如果你需要更复杂的mock逻辑,可以写一个异步函数作为side_effect:
# a.py from unittest.mock import patch import b from django.test import AsyncTestCase async def mock_valid_trigger(*args, **kwargs): return True class TriggerTest(AsyncTestCase): @patch("b.Trigger.is_valid_trigger", side_effect=mock_valid_trigger) async def test_apply_working(self, mock_is_valid): result = await b.Trigger().is_valid_trigger(event=None) self.assertEqual(result, True) mock_is_valid.assert_called_once_with(event=None)
额外说明
关于patch的路径:因为你在a.py里直接导入并使用b.Trigger,所以@patch("b.Trigger.is_valid_trigger")是正确的路径。如果你的测试代码是在其他模块中使用Trigger,则需要patch那个模块中导入的Trigger路径(比如如果模块c.py里from b import Trigger,那就要patch"c.Trigger.is_valid_trigger")。
内容的提问来源于stack exchange,提问作者Joseph Groot Kormelink
相关产品推荐
相关产品推荐

