来自静态编程语言背景,我想知道如何最好地在 Python 中进行模拟。我习惯了依赖注入(inject)。在测试中,创建模拟并将其传递给被测系统 (SUT)。然而,看看 Mock 和其他 Python 模拟框架,似乎类型/函数/等。在逐个测试的基础上替换模块中的内容。
特别是,对于 Mock,在每个单元测试的顶部,你为每个类型/函数/等等说 @patch('some.type.in.the.module.under.test')
。你想 mock 。在测试的整个生命周期中,这些东西被 mock ,然后被还原。不幸的是,在整个测试中,fixture 非常接近相同,您最终会一遍又一遍地重复您的 @patch
es。
我想要一种跨单元测试共享补丁集合的方法。我还想以可组合的方式对灯具进行调整。我可以使用上下文管理器而不是装饰器。
最佳答案
您可以修补流向该类中每个方法的测试类。然后您可以从父类(super class)继承并使用 setUp 和 tearDown 方法。
import unittest
@patch('some.type.in.the.module.under.test')
class MySuperTestCase(unittest.TestCase):
pass
class MyActualTestCase(MySuperTestCase):
def test_method(self, mock_function)
mock_function.return_value = False
这并不像您想象的那样普遍。因为您需要在使用对象的确切位置修补对象。您不修补“sys.stdout”,而是修补“my_dir.my_module.sys.stdout”。所以它实际上只在测试特定模块时有用。但是要测试该特定模型,您当然可能只需要一个补丁装饰器。
关于python - 使用 Python 模拟时避免冗余 @patch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11657614/