繁体   English   中英

如何使用补丁模拟实例属性中的类

[英]How to mock a class in an instance attribute using patch

我是python的新手,目前正在尝试为一个类编写单元测试,但是在模拟依赖项时遇到了一些问题。 我有2个类,其中一个(ClassB)是另一个(ClassC)的依赖项。 目标是在ClassC测试用例中模拟ClassB和ArgumentParser类。 ClassB看起来如下:

# defined in a.b.b
class ClassB:
    def doStuff(self) -> None:
        # do stuff
        pass

    def doSomethingElse(self) -> None:
        # do something else
        pass

ClassC:

# defined in a.b.c
from .b import ClassB
from argparse import ArgumentParser

class ClassC:

    b

    def __init__(self) -> None:
        arguments = self.parseArguments()
        self.b = ClassB()
        self.b.doStuff()

    def close(self) -> None:
        self.b.doSomethingElse()

    def parseArguments(self) -> dict:
        c = ArgumentParser()
        return return parser.parse_args()

最后,ClassC的测试用例:

# inside a.b.test
from unittest import TestCase
from unittest.mock import patch, MagicMock
from a.b.c import ClassC

class ClassCTest(TestCase):
    @patch('a.b.c.ClassB')
    @patch('a.b.c.ArgumentParser')
    def test__init__(self, mock_ArgumentParser, mock_ClassB):
        c = ClassC()
        print(isinstance(c.b, MagicMock))           # outputs False
        # for reference
        print(isinstance(mock_ClassB, MagicMock))   # outputs True

我在补丁文档中读到,重要的是在名称空间(而不是在定义位置)中模拟该类。 这就是我所做的,我嘲笑: abc .classB而不是abbclassB,但都尝试过。 我也尝试在test__init__方法主体内部导入ClassC,但这也行不通。 我更喜欢不是模拟ClassB的方法,而是整个类,以使测试尽可能地隔离。

环境信息:Python 3.6.1

任何帮助将不胜感激!

由于我是python的新手,所以我不了解类属性 我在持有ClassB的ClassC中有一个class属性,而在init中有一个实例属性遮盖了class属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM