使用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'
在上面的示例中,测试中的参数必须是foo
和bar
。是否有任何干净的方式允许它们使用更明确的区分,例如mock_foo
?
如果在部分测试中需要原始类或方法,避免像from module import Class as OriginalClass
提前致谢。
答案 0 :(得分:3)
不,......是的:
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'