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

如何在Django测试中验证一个函数执行时调用了另一个函数?

问题解决:测试Manager方法是否调用目标函数

核心问题:Mock路径错误

测试失败的原因是mock的目标路径不对。Python的unittest.mock.patch作用于被测试代码实际导入并使用的函数引用,而非原函数所在的模块。

假设你的ItemsManager类在items/managers.py中,它导入items_bulk_updated的方式是:

# items/managers.py
from .signals import items_bulk_updated

class ItemsManager(models.Manager):
    # 你的bulk_update方法

此时ItemsManager里调用的items_bulk_updated是items.managers模块内的引用,而非items.signals里的原函数。你当前patch的是原函数所在模块,自然捕获不到调用。

修正后的测试代码

将patch路径改为Manager模块中引用的函数,同时补充必要的测试数据(避免空QuerySet导致逻辑不执行):

from unittest import mock

# Base TestCase Inherits from APITestCase
class TestItems(BaseTestCase):

    # 改为Manager模块内的函数引用路径
    @mock.patch("items.managers.items_bulk_updated", autospec=True)
    def test_bulk_update_items_triggers_signal(self, mock_function):
        # 创建测试实例
        Items.objects.create(item_name="test1")
        Items.objects.create(item_name="test2")
        
        items_qs = Items.objects.all()
        # 修改字段值,确保bulk_update执行更新逻辑
        for item in items_qs:
            item.item_name = f"updated_{item.item_name}"
        
        result = Items.objects.bulk_update(items_qs, ['item_name'])
        mock_function.assert_called()

额外注意事项

  • 确认Items模型的objects管理器确实绑定了ItemsManager,而非默认的models.Manager。
  • 空QuerySet调用bulk_update可能跳过后续逻辑,测试前必须创建有效数据并修改字段值。
  • autospec=True可确保mock函数的签名与原函数一致,避免测试假阳性。

内容的提问来源于stack exchange,提问作者Abdoo.ay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:25:36