Python Mock修补本地类引用失败问题求助
解决Python Mock Patch同一文件类引用的问题
我刚好也碰到过类似的问题,咱们一步步来拆解和解决:
问题根源分析
你现在的核心问题有两个,其中一个是断言逻辑错误,另一个是需要确认patch路径的有效性:
断言对象搞反了:
你patch的是Backfill这个类,当代码执行backfill = Backfill()时,实际上是调用了mock类的构造函数,返回一个mock实例,然后才是调用这个实例的run()方法。你之前断言的mock_backfill.run.call_count是在检查mock类本身的run方法,但实际被调用的是mock实例的run方法,这完全不是一回事。patch路径的验证:
由于Flow.run里直接引用了同一模块下的Backfill,所以patch('engine.dataflows.flow.Backfill')这个路径是正确的——符合mock的核心原则:patch对象被使用的位置,而非定义的位置。不过要确保你的测试环境中,Python能正确识别engine.dataflows.flow这个模块路径(比如运行pytest时,项目根目录package要在sys.path里)。
修正后的测试代码
把断言逻辑改对,测试就能正常通过了:
import unittest from unittest.mock import Mock, patch from engine.dataflows.flow import Flow class MockFlow(Flow): # 这里保留你的自定义实现,如果没有特殊逻辑可以直接pass pass class TestFlowRun(unittest.TestCase): def setUp(self): self.flow = MockFlow() def test_run_type_c(self): with patch('engine.dataflows.flow.Backfill') as mock_backfill: self.flow.run(type='C') # 正确断言:mock实例的run方法被调用了一次 mock_backfill.return_value.run.assert_called_once()
额外注意点
- 如果你的
MockFlow重写了run方法,那测试的就不是原Flow类的逻辑了,一定要确保MockFlow只是继承而没有覆盖父类的run方法。 - 如果你后续碰到同一模块内类引用的patch问题,记住一个口诀:看代码里是从哪个命名空间取的对象,就patch哪个命名空间的对象。比如如果
Flow里是用from . import Backfill然后直接用Backfill,那patch模块级的Backfill就没问题;如果是用self.__class__.__module__.Backfill,那就要对应调整patch路径。
内容的提问来源于stack exchange,提问作者TH58PZ700U
相关产品推荐
相关产品推荐

