Python Mock patch.multiple参数名称

时间:2015-01-30 11:42:05

标签: python unit-testing mocking

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

@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

如果在部分测试中需要原始类或方法,避免像from module import Class as OriginalClass

这样的导入,这也会很方便

提前致谢。

1 个答案:

答案 0 :(得分:3)

不,......是的:

  • 不,因为如果您查看mock source code,您会发现无法更改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'

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