欢迎访问宙启技术站
智能推送

如何使用unittest.mock.patchstopall()进行模块级别的修补与恢复

发布时间:2023-12-26 17:38:11

unittest.mock.patch.stopall() 方法用于停止所有在当前测试中使用的修补。在测试中,我们通常会使用 unittest.mock.patch 来暂时修改模块中的某些函数或方法的返回值,以便在测试中指定行为。在完成测试后,我们需要恢复这些修补,以避免对其他测试造成影响。

下面是一个使用 unittest.mock.patch.stopall() 进行模块级别修补和恢复的例子:

import unittest
from unittest.mock import patch
import my_module

class MyTest(unittest.TestCase):

    def setUp(self):
        self.patcher = patch('my_module.some_function')  # 创建修补的对象
        self.mock_some_function = self.patcher.start()  # 启动修补,并返回一个 mock 对象

    def tearDown(self):
        self.patcher.stop()  # 停止修补

    def test_something(self):
        self.mock_some_function.return_value = 'mocked value'  # 修改修补后的函数返回值
        result = my_module.some_function()  # 调用被修补过的函数
        self.assertEqual(result, 'mocked value')  # 检查返回值是否与预期相符

    def test_something_else(self):
        result = my_module.some_function()  # 调用未被修补过的函数
        self.assertNotEqual(result, 'mocked value')  # 检查返回值是否与预期不相符

if __name__ == '__main__':
    unittest.main()

在上面的例子中,我们使用 patch() 方法来创建一个修补的对象,并且将要修补的函数的路径作为参数传递给它。然后,我们可以使用 start() 方法来启动修补,并返回一个 mock 对象。在 setUp() 方法中,我们将修补的对象保存为实例属性 self.patcher,以便在测试方法中使用。

在测试方法 test_something() 中,我们利用 self.mock_some_function.return_value 属性来修改修补后的函数 my_module.some_function() 的返回值。然后,我们调用修补后的函数,并使用 assertEqual() 方法来检查返回值是否与预期相符。

在测试方法 test_something_else() 中,我们未修改修补函数的返回值,然后调用原始的未修补函数,并使用 assertNotEqual() 方法来检查返回值是否与预期不相符。

tearDown() 方法中,我们使用 stop() 方法停止修补。

通过使用 unittest.mock.patch.stopall(),我们可以一次性停止当前测试中的所有修补,以确保对其他测试不会产生影响。

需要注意的是,在每个测试方法中都要重新启动修补,以便在每次测试之前都有一个独立的修补对象。这样可以确保每个测试方法在互相独立的环境中运行,而不会相互影响。同时,patch() 方法还支持多个修补对象的创建,可以在一个测试方法中同时修补多个函数。