如何使用补丁

时间:2017-07-14 17:16:40

标签: python python-3.x unit-testing

我对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

我在补丁docs中读到,在名称空间中使用它而不是在定义它的地方模拟它是很重要的。这就是我所做的,我嘲笑: a.b.c .classB而不是a.b.b.classB,虽然已经尝试过。我也尝试在test__init__方法体内导入ClassC,但这也没有用。 我不喜欢嘲笑ClassB的方法,而是整个类,以尽可能地保持测试。

环境信息: Python 3.6.1

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

因为我是python的新手,所以我不知道class attributes。我在ClassC中有一个class属性,其中包含ClassB和 init 中的一个实例属性,它隐藏了class属性。