gpt4 book ai didi

python - 模拟在 Python 2.7 中访问时引发异常的可订阅属性的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 01:08:21 25 4
gpt4 key购买 nike

Python 2.7.1,模拟 1.0.1

我想编写一个使用此处显示的功能的单元测试,即在尝试使用下标语法访问模拟属性时成功引发 IndexError,如下所示:

repo = MagicMock()
repo.heads = PropertyMock(side_effect=IndexError())
with self.assertRaises(IndexError):
_ = repo.heads['nonexistant']

什么是最pythonic的方式来做到这一点?上面的代码根本没有引发 IndexError,而是引发了 TypeError,表明 PropertyMock 不可订阅。

TypeError: 'PropertyMock' object is not subscriptable

我应该注意到实际的单元测试看起来根本不像这样。真正的单元测试试图断言某些行为,但如果不模拟底层第三方模块中的类就不能这样做,当 getitem 在其 Repo 对象上调用时有效地复制该底层模块的行为,这导致引发 IndexError。

撇开上下文不谈,我将 repo 声明为 MagicMock() 对象然后将 repo.heads 声明为 PropertyMock 对象是否多余?我研究了模拟文档一段时间,但没有这个特定用例的示例,我无法让它工作。我也尝试使用 MagicMock(side_effect=IndexError()),但无济于事。

在我看来,人们应该能够在模拟中简单轻松地促进这种行为并继续他们的一天。我相信这是可能的,但我不知道如何实现,这就是我问这个问题的原因。

什么是真正的解决方案?

最佳答案

对于 repo.heads,您可以使用 MagicMock 而不是 PropertyMock。它应该适用于您的示例,但我不知道您的实际测试是否依赖于 PropertyMock

repo = MagicMock()
repo.heads.__getitem__.side_effect = IndexError
with self.assertRaises(IndexError):
_ = repo.heads['nonexistant']

如果您希望它在访问特定值时引发 IndexError,您应该将自定义处理函数分配给 repo.heads.__getitem__.side_effect

关于python - 模拟在 Python 2.7 中访问时引发异常的可订阅属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22872658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com