在 python 中模拟类上的多个方法的干净方法是什么?

Stu*_*nes 2 python django unit-testing mocking

在编写测试时,我经常需要模拟多个类方法。目前我正在通过with包含引用的嵌套语句来执行此操作mock,例如

from ... import A


def test_sample(self)
    instance = A()
    with mock(A, 'function_1', return_value=1):
        with mock(A, 'function_2', return_value=2):
            with mock(A, 'function_3', return_value=3):
                assert A.function_4, 10
Run Code Online (Sandbox Code Playgroud)

有没有更简洁/推荐的方法来做到这一点?如果能够删除多个嵌套调用那就太好了!

在此过程中,类上可能有也可能没有其他未被模拟的方法。

sol*_*oke 5

您不需要嵌套上下文管理器 - 您可以一次性修补所有方法:

def test_sample(self)
    instance = A()
    with (mock(A, 'function_1', return_value=1),
          mock(A, 'function_2', return_value=2),
          mock(A, 'function_3', return_value=3)):

         assert A.function_4, 10
Run Code Online (Sandbox Code Playgroud)

或者您可以使用patch.multiple

from unittest import patch

def test_sample(self)
    instance = A()
    with patch.multiple(A, function_1=2, function_2=2, function_3=3) as patched_values:
        assert A.function_4, 10
Run Code Online (Sandbox Code Playgroud)

  • 第一个选项需要 python 3.9 或更高版本 (2认同)