python - 修补本地类引用
问题描述
像许多人一样,我在模拟修补和正确路径方面遇到问题。具体来说,我的代码引用了同一文件中的另一个类,我无法修补该引用。
我有以下 python 文件,package/engine/dataflows/flow.py:
class Flow:
def run(self, type):
if type == 'A':
method1()
elif type == 'B':
method2()
else:
backfill = Backfill()
backfill.run()
class Backfill(Flow):
def run(self):
...
还有一个测试文件 package/tests/engine/dataflows/test_Flow.py
import unittest
from unittest.mock import Mock, patch
from engine.dataflows.flow import Flow
class MockFlow(Flow):
...
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')
assert mock_backfill.run.call_count == 1
该补丁的工作原理是在使用 pytest 运行时不会引发错误,但断言失败。我认为这是因为在初始化 MockFlow 时,基本上已经导入了对 Backfill 类的本地引用,但我一直无法想出一个修补路径来处理这个问题。
flow.py 的内容包括 Flow 基类和几个实现不同数据流模式的子类。它们位于同一个文件中,以便于理解和常见的依赖关系。
解决方案
问题是您正在检查一个类的 run() 函数,而不是该类的实例化。模拟的 Backfill 类将通过其构造函数/init 返回该类的实例。那就是您要检查的模拟/对象。
with patch('engine.dataflows.flow.Backfill') as mock_backfill:
mocked_backfill_instance = mock_backfill.return_value
self.flow.run(type='C')
assert mocked_backfill_instance.run.call_count == 1
推荐阅读
- python - 从 numpy 数组中删除一个元素
- ruby-on-rails - 找出当前时间是否在两次之间
- java - ObjectNode 返回未知值
- tensorflow - 张量流会话的创建是否有开销?
- python - Python点击选项 - 如果参数multiple没有传递,避免多次使用相同的选项
- android - 矩形中的 Android 屏幕边界
- php - Laravel > 5.5 会话和 API
- bash - 如何检查命令的输出是否包含字符串,如果字符串存在则运行命令
- ffmpeg - ffmpeg mp4 到 hls 限制输出块大小而不是持续时间
- c# - 选择 DropDownList1 值时,DropDownList2 中的重复值存储