pytest无法识别Mock的嵌套函数,调用真实函数致测试失败求助
问题分析与解决方法
核心问题是mock的路径不正确,Python的unittest.mock是基于代码实际引用的对象路径来替换的,而非原函数的定义路径。
原因说明
如果你的scheduler_api.py中是通过from drpCtReactor.utils.reactor_client import get_client这种方式导入get_client的,那么在scheduler_api模块的命名空间里,get_client是一个本地引用。此时你mock原模块drpCtReactor.utils.reactor_client.get_client不会生效,因为被测试的create函数调用的是scheduler_api模块内的本地引用,而非原模块的函数。
修正后的测试代码
将patch的目标路径改为被测试模块中get_client的实际引用路径,比如如果create函数在scheduler_api.py中,就patchscheduler_api.get_client:
def test_create(): scheduler_to_create = Scheduler(title = "test_scheduler", description="test scheduler") stub_scheduler_created = Scheduler(uuid="1", title="test_scheduler", description="test scheduler") # 重点:替换为被测试模块中get_client的引用路径 with patch("scheduler_api.get_client") as mock_client: mock_client.return_value.create_scheduler.return_value = stub_scheduler_created result = create(scheduler_to_create) # 建议添加断言验证结果符合预期 assert result == stub_scheduler_created
额外验证方式
如果不确定正确的mock路径,可以在scheduler_api.py的create函数中临时添加一行打印:
print(get_client.__module__)
运行测试后,打印出的模块路径就是你需要patch的目标前缀。
内容的提问来源于stack exchange,提问作者Abdul Salam
相关产品推荐
相关产品推荐

