首页 > 解决方案 > 如何使用一次声明/定义 @patch 并在测试类中的每个单元测试中使用它

问题描述

我有一个代码案例,我必须从多个数据库表中提取数据。我一直在使用patchfrommock package来编写单元测试用例。在测试用例中模拟数据库时,我在每个测试中都使用补丁,每个类大约有 10-15 个测试。有什么方法可以声明@patch一次并将其分配给变量并使用变量而不是@patch在每个测试中使用。例子:

@patch("py-repo.module.class.get_data_from_db_1",
           side_effect=mock_method1)
@patch("py-repo.module.class.get_data_from_db_2",
           side_effect=mock_method2)
@patch("py-repo.module.class.get_data_from_db_3",
           side_effect=mock_method3)
def test_case_1(self, mock_1, mock_2, mock_3):
    self.assertEqual("some outputs",object("some inputs"))

标签: pythonunit-testingmockingpatch

解决方案


patch()非常灵活。您当前将它用作函数装饰器,但它也可以是类装饰器。然后它将期望该类上的每个测试方法都接受相同的模拟对象。

如果您不想为每个测试方法声明参数,您还可以从测试类的方法中调用修补程序的start()方法setUp(),并将模拟对象存储在成员变量中。请务必使用addCleanup()来调用stop()

另一种选择:编写一个自定义上下文库,使用 with 块中的所有补丁,并返回到测试方法。


推荐阅读