无法使用unittest修补测试类实例化的类

six*_*rm1 6 python python-3.x python-unittest

我正在尝试修补由我尝试测试的类实例化的类,但它不起作用.我已经阅读了各种文档,但仍然没有找到我做错了什么.这是代码片段:

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')
Run Code Online (Sandbox Code Playgroud)

module/ClassToPatch.py:

class ClassToPatch(object):
    def __init__(self):
        pass
    def my_method(self):
        return "abc"
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

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

Eth*_*man 5

正如诺伯特提到的,解决方法是将模拟行从

@mock.patch('module.ClassToPatch.ClassToPatch', autospec = False)
Run Code Online (Sandbox Code Playgroud)

@mock.patch('module.ClassToTest.ClassToPatch', autospec = False)
Run Code Online (Sandbox Code Playgroud)

根据文档

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

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