Python 模拟 patch.multiple 参数名称

Python Mock patch.multiple argument names

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

@patch('module.ClassName2')
@patch('module.ClassName1')
def test(MockClass1, MockClass2):
    MockClass1.test.return_value = 'testing'

但是,我似乎无法在文档中找到如何在使用 patch.multiple 时区分原始对象和模拟对象。

@patch.multiple('module.ClassName', foo=DEFAULT, bar=DEFAULT)
def test(foo, bar):
    foo.return_value = 'foo'

在上面的例子中,测试中的参数必须是foobar。有没有什么干净的方法可以让它们的使用有更清晰的区别,例如mock_foo?

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

这样的导入

提前致谢。

否...是:

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

按照一个简单的例子说明如何做到这一点...我知道这可能不是您要找的东西,但这是唯一的方法。

@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'

如果你使用 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'