Python Mock patch.multiple 参数名称

Ben*_*den 4 python unit-testing mocking

使用 patch 作为装饰器时,可以更改修补类或函数的测试参数名称。

@patch('module.ClassName2')
@patch('module.ClassName1')
def test(MockClass1, MockClass2):
    MockClass1.test.return_value = 'testing'
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法在文档中找到如何在使用patch.multiple.

@patch.multiple('module.ClassName', foo=DEFAULT, bar=DEFAULT)
def test(foo, bar):
    foo.return_value = 'foo'
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,测试中的参数必须是fooand bar。是否有任何干净的方法来允许它们以更清晰的区分使用,例如mock_foo

在测试的一部分需要原始类或方法的情况下,这也很方便,避免导入 from module import Class as OriginalClass

提前致谢。

Mic*_*ico 7

不和......是的:

  • 不,因为如果您查看mock源代码,您会发现无法更改attribute_name
  • 是的,因为它们作为关键字 args 传递,因此它们嵌入在关键字 args 字典中:因此您可以根据需要从字典中提取它们。

遵循一个简单的例子来说明如何做到这一点......我知道这可能不是你正在寻找的,但它是唯一的方法。

@patch.multiple('module.ClassName', foo=DEFAULT, bar=DEFAULT)
def test(**mocks):
    mock_foo, mock_bar = mocks["foo"], mocks["bar"]
    mock_foo.return_value = 'foo'
    mock_bar.return_value = 'bar'
Run Code Online (Sandbox Code Playgroud)

如果您patch.multiple用作上下文管理器,这是获取模拟的唯一方法,那么这两种方法是一致的

def test():
    with patch.multiple('module.ClassName', foo=DEFAULT, bar=DEFAULT) as mocks:
        mock_foo, mock_bar = mocks["foo"], mocks["bar"]
        mock_foo.return_value = 'foo'
        mock_bar.return_value = 'bar'
Run Code Online (Sandbox Code Playgroud)