Django中unittest mock未按预期生效,调用原函数返回真实值问题咨询
问题分析与解决方案
你遇到的是unittest.mock.patch的常见使用误区——patch的目标与实际调用的函数引用不匹配,导致mock未生效。调用get_user_from_db(1)返回"Alice"不是预期行为,属于操作有误。
问题根源
- 你在测试文件中先执行了
from app1.service import get_user_from_db,这会把原函数的引用直接存入测试模块的命名空间。 - 而
@mock.patch("app1.service.get_user_from_db")仅在app1.service模块层面替换了该函数,但测试文件已经持有了原函数的独立引用,调用导入后的get_user_from_db时,并不会使用被mock后的版本。 - 直接调用
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
相关产品推荐
相关产品推荐

