当使用补丁作为装饰器时,可以更改补丁类或函数的测试参数名称。
@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
这样的导入
提前致谢。
最佳答案
不……是的:
- 不,因为如果您查看
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
作为上下文管理器,那是获取mocks的唯一方式,所以这两种方式是一致的
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'
关于Python Mock patch.multiple 参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28235168/