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

