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

跨文件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:43:25