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

Django中unittest mock未按预期生效,调用原函数返回真实值问题咨询

问题分析与解决方案

你遇到的是unittest.mock.patch的常见使用误区——patch的目标与实际调用的函数引用不匹配,导致mock未生效。调用get_user_from_db(1)返回"Alice"不是预期行为,属于操作有误。

问题根源

  1. 你在测试文件中先执行了from app1.service import get_user_from_db,这会把原函数的引用直接存入测试模块的命名空间。
  2. 而@mock.patch("app1.service.get_user_from_db")仅在app1.service模块层面替换了该函数,但测试文件已经持有了原函数的独立引用,调用导入后的get_user_from_db时,并不会使用被mock后的版本。
  3. 直接调用mock_get_user_from_db是使用patch注入的mock对象,因此能返回预期的"Mocked Alice"。

两种解决方法

方法一:通过模块引用调用函数

修改导入和调用方式,使用模块级别的引用,确保调用的是被patch后的函数:

import pytest
from unittest import mock

from app1 import service  # 改为导入整个模块


@mock.patch("app1.service.get_user_from_db")
def test_get_user_from_db(mock_get_user_from_db):
    mock_get_user_from_db.return_value = "Mocked Alice"
    username = service.get_user_from_db(1)  # 通过模块调用函数
    assert username == "Mocked Alice"

方法二:patch测试模块中导入的函数引用

修改patch的目标为测试文件中已导入的函数路径,直接替换测试模块内的函数引用:

import pytest
from unittest import mock

from app1.service import get_user_from_db


@mock.patch("app1.tests.test_service.get_user_from_db")  # 修改patch目标为测试模块内的引用
def test_get_user_from_db(mock_get_user_from_db):
    mock_get_user_from_db.return_value = "Mocked Alice"
    username = get_user_from_db(1)
    assert username == "Mocked Alice"

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:37:11