Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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 unittest.mock.patch:上下文管理器与unittest中的设置/拆卸_Python_Python Unittest - Fatal编程技术网

Python unittest.mock.patch:上下文管理器与unittest中的设置/拆卸

Python unittest.mock.patch:上下文管理器与unittest中的设置/拆卸,python,python-unittest,Python,Python Unittest,似乎有两种使用方法:一种方法更好吗 使用上下文管理器和with语句: class MyTest(TestCase): def test_something(self): with patch('package.module.Class') as MockClass: assert package.module.Class is MockClass 或从设置和拆卸/清理调用开始和停止: class MyTest(TestCase): def

似乎有两种使用方法:一种方法更好吗

使用上下文管理器和with语句:

class MyTest(TestCase):
    def test_something(self):
        with patch('package.module.Class') as MockClass:
            assert package.module.Class is MockClass
或从设置和拆卸/清理调用开始和停止:

class MyTest(TestCase):
    def setUp(self):
        patcher = patch('package.module.Class')
        self.MockClass = patcher.start()
        self.addCleanup(patcher.stop)

    def test_something(self):
        assert package.module.Class is self.MockClass

上下文管理器版本的代码更少,因此易于阅读。我是否有任何理由更喜欢使用TestCase设置/拆卸基础设施?

设置中选择修补的主要原因是,如果您有多个测试需要修补该类。在这种情况下,您需要在每个测试中复制
with
语句


如果只有一个测试需要补丁,我更喜欢with语句的可读性。

还有第三种方法可以使用它,作为装饰器:

class MyTest(testcase):

    @unittest.mock.patch('package.module.Class')
    def test_something(self):
        assert package.module.Class is self.MockClass
这是更少的代码,但这可能不相关

有几个注意事项:(1)(正如babbageclunk所指出的)如果您需要重用补丁,那么在
设置中调用一个简单、枯燥的函数来构建一个补丁是最好的,并且易于阅读。(2) 如果您想创建任何元编程工具,以便在运行测试时打开或关闭修补程序,那么decorator方法将为您节省很多麻烦。在这种情况下,您可以编写一个额外的decorator,或者使用一个全局变量(ick)来控制补丁decorator是否应用于测试函数。如果它们嵌入到函数定义中,那么如果您想在运行测试时关闭修补,就必须手动处理它们。您可能希望这样做的一个简单原因是,运行测试时不进行修补,以导致大量失败,并观察哪些部分尚未实现(事实上,你的补丁元编程修饰师可以捕捉到这些问题,并为你打印nice
NotImplemented
异常,甚至生成一个包含这些内容的报告)。可能还有更多的理由需要对补丁是否(以及在多大程度上)在给定时间在测试套件中“调度”进行精细控制

decorator方法也很好,因为(a)它允许您以该函数之外的方式隔离哪些补丁程序到哪些测试函数,但无需将其提交到
设置
,以及(b)当给定函数需要给定补丁程序时,它可以让读者非常清楚

在这种情况下,上下文管理器版本似乎没有太多的好处,因为它几乎比装饰器版本更具可读性。但是,如果真的只有一个案例,或者使用了一组非常小的特定案例,那么上下文管理器版本将是完美的。

可能的重复