如何在Python 2.7中正确地模拟出现异常的可以访问的可索引属性?

2024-05-05 03:57:43 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 2.7.1,模拟1.0.1

我想编写一个单元测试,它使用这里显示的功能,即在尝试使用如下所示的下标语法访问模拟属性时成功地引发索引器错误:

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

什么是最顽皮的方式来做这个?上面的代码根本不会引发索引器错误,而是一个表示PropertyMock不可订阅的TypeError。

TypeError: 'PropertyMock' object is not subscriptable

我应该注意到实际的单元测试根本不像这样。真正的单元测试试图断言某些行为,但如果不模拟底层第三方模块中的类,则无法这样做,当对其Repo对象调用getitem时,会有效地复制底层模块的行为,这会导致引发索引器错误。

撇开上下文不谈,我是不是把repo声明为MagicMock()对象,然后把repo.heads声明为PropertyMock对象,这就多余了?我在模拟文档上花了一段时间,但是没有这个特定用例的例子,我不能让它工作。我还尝试使用MagicMock(side_effect=IndexError()),但没有成功。

在我看来,一个人应该能够简单和容易地促进这种行为在一个模拟,并与他们的一天。我相信这是可能的,但我不知道怎么做,这就是我问这个问题的原因。

真正的解决办法是什么?


Tags: 模块对象功能声明错误repo单元测试side
1条回答
网友
1楼 · 发布于 2024-05-05 03:57:43

你可以用MagicMock代替PropertyMock来表示repo.heads。对于您的示例,它应该是有效的,但我不知道您的实际测试是否依赖于PropertyMock

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

如果希望它在访问特定值时引发IndexError,则应为repo.heads.__getitem__.side_effect分配自定义处理程序函数。

相关问题 更多 >