Python Mock patch.multiple 参数名称

标签 python unit-testing mocking

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

@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 这样的导入

提前致谢。

最佳答案

不……是的:

  • 不,因为如果您查看 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/

相关文章:

python - 通过 python 对象设置全局 numpy 数组的子部分或切片

java - 如何使用参数化构造函数运行 junit

unit-testing - Symfony 2 单元测试中的表单验证

c++ - C++ 单元测试器中的自定义断言

c# - 在单元测试中模拟类中的类

c# - 单元测试 Web App 时如何模拟应用程序路径

python - 不能直接通过 `locals()`在python中设置局部变量

python - Python环境变量不起作用

python - 有没有办法让我们在discord.py中一次获取多个命令的剩余冷却时间?

c# - 在 Moq 中模拟 is 运算符