python - 使用 Python 模拟时避免冗余 @patch

标签 python mocking patch code-duplication

来自静态编程语言背景,我想知道如何最好地在 Python 中进行模拟。我习惯了依赖注入(inject)。在测试中,创建模拟并将其传递给被测系统 (SUT)。然而,看看 Mock 和其他 Python 模拟框架,似乎类型/函数/等。在逐个测试的基础上替换模块中的内容。

特别是,对于 Mock,在每个单元测试的顶部,你为每个类型/函数/等等说 @patch('some.type.in.the.module.under.test')。你想 mock 。在测试的整个生命周期中,这些东西被 mock ,然后被还原。不幸的是,在整个测试中,fixture 非常接近相同,您最终会一遍又一遍地重复您的 @patches。

我想要一种跨单元测试共享补丁集合的方法。我还想以可组合的方式对灯具进行调整。我可以使用上下文管理器而不是装饰器。

最佳答案

您可以修补流向该类中每个方法的测试类。然后您可以从父类(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/

相关文章:

python - 使用 Selenium Python 填充验证码

python - 使用 Db 数据填充 Django 表单字段数据

Python在迭代时从列表中删除

mocking - 你应该只模拟你拥有的类型吗?

java - 模拟 CGLIB 增强对象

python - 检索列表中 NaN 的索引

c++ - 在 C++ 中将模拟对象转换为它们的抽象基类

Windows PowerShell : How to do standard-in redirection & passing parameters to commands properly?

我是错误 : “error: while searching for:”

security - 应用最后一个 redhat 内核补丁后 Tomcat 无法启动