【问题标题】:Unable to patch class instantiated by the tested class using unittest无法使用 unittest 修补由测试类实例化的类
【发布时间】:2023-04-09 15:53:01
【问题描述】:

我正在尝试修补由我尝试测试的类实例化的类,但它不起作用。我已经阅读了各种文档,但仍然没有发现我做错了什么。这是代码sn-p:

tests/Test.py:

from module.ClassToTest import ClassToTest

class Test(object):

    @mock.patch('module.ClassToPatch.ClassToPatch', autospec = False)
    def setUp(self, my_class_mock):
        self.instance = my_class_mock.return_value
        self.instance.my_method.return_value = "def"
        self.class_to_test = ClassToTest()

    def test(self):
        val = self.class_to_test.instance.my_method() #Returns 'abc' instead of 'def'
        self.assertEqual(val, 'def')

module/ClassToPatch.py:

class ClassToPatch(object):
    def __init__(self):
        pass
    def my_method(self):
        return "abc"

module/ClassToTest.py:

from module.ClassToPatch import ClassToPatch

class ClassToTest(object):
    def __init__:
        # Still instantiates the concrete class instead of the mock
        self.instance = ClassToPatch()

我知道在这种情况下我可以轻松地注入依赖项,但这只是一个示例。此外,我们对每个文件策略使用单个类,文件的命名与类类似,因此导入命名很奇怪。

【问题讨论】:

  • 试试@mock.patch('module.ClassToTest.ClassToPatch', autospec = False)
  • 以后,请将您的示例代码设为MCVE;您发布的代码中存在多个错误,您不能依赖对问题足够熟悉的人来立即发现问题并提供解决方案。
  • 好的,我会注意的

标签: python python-3.x python-unittest


【解决方案1】:

正如 norbert 所提到的,解决方法是将模拟行从

@mock.patch('module.ClassToPatch.ClassToPatch', autospec = False)

@mock.patch('module.ClassToTest.ClassToPatch', autospec = False)

According to the docs:

patch() 装饰器/上下文管理器可以轻松地模拟被测模块中的类或对象。您指定的对象将在测试期间被模拟(或其他对象)替换,并在测试结束时恢复。

您正在测试ClassToTest 模块,而不是ClassToPatch 模块。

【讨论】:

  • 我遇到了类似的情况。我需要修补在不同模块中实例化的类实例。有可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多