【问题标题】:Patching local class reference修补本地类引用
【发布时间】:2020-04-29 15:51:53
【问题描述】:

像许多人一样,我在模拟修补和正确路径方面遇到问题。具体来说,我的代码引用了同一文件中的另一个类,我无法修补该引用。

我有以下 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):
    ...

还有一个测试文件包/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 基类和几个实现不同数据流模式的子类。它们位于同一个文件中,以便于理解和共同的依赖关系。

【问题讨论】:

  • 如果您可以显示您使用的实际导入语句,以了解应该模拟什么,这将有所帮助。
  • @MrBeanBremen 添加。唯一相关的导入在 test_Flow.py

标签: python unit-testing mocking pytest


【解决方案1】:

问题是您正在检查一个类的 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

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2018-11-09
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2017-07-13
    • 2014-02-15
    • 2010-11-01
    相关资源
    最近更新 更多