Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用补丁模拟实例属性中的类_Python_Python 3.x_Unit Testing - Fatal编程技术网

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

Python 如何使用补丁模拟实例属性中的类,python,python-3.x,unit-testing,Python,Python 3.x,Unit Testing,我是python新手,目前正在尝试为类编写单元测试,但在模拟依赖项方面遇到了一些问题。我有两个类,其中一个(ClassB)是另一个(ClassC)的依赖项。目标是在ClassC的测试用例中模拟ClassB和ArgumentParser类。ClassB如下所示: # defined in a.b.b class ClassB: def doStuff(self) -> None: # do stuff pass def doSomething

我是python新手,目前正在尝试为类编写单元测试,但在模拟依赖项方面遇到了一些问题。我有两个类,其中一个(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
C类:

# 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()
最后,C类的测试用例:

# 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
我在补丁中读到,重要的是在名称空间中模拟类,而不是在定义它的地方使用它。这就是我所做的,我嘲笑道:a.b.c.classB而不是a.b.b.classB,但我已经尝试了这两种方法。我还尝试在test\uu init\uuu方法体中导入ClassC,但这也不起作用。 我不喜欢模仿ClassB的方法,而是喜欢整个类来尽可能地隔离测试

环境信息: Python 3.6.1


任何帮助都将不胜感激

因为我是python新手,所以我对python一无所知。我在ClassC中有一个class属性,它保存着ClassB,在init中有一个实例属性,它隐藏着class属性

在你的测试中,
print(c.b)
是什么对象?它是
ClassB
的实例吗?它不是,但是你的问题让我意识到我有一个与实例属性同名的class属性!现在修好了