如何模拟缺少的属性

时间:2013-07-19 19:35:13

标签: python mocking

我有一行代码:

if not hasattr(class.a, u'c'):
    return

如何模拟类,以便class.a.c为hasattr返回False?

如果我这样做:

>>> from mock import MagicMock
>>> mock_class = MagicMock(spec=[u'a'])
>>> hasattr(mock_class, u'a')
True
>>> hasattr(mock_class, u'b')
False
>>> hasattr(mock_class.a, u'c')
True

虽然我没有说明class.a.c,但它被嘲笑!!!

2 个答案:

答案 0 :(得分:5)

实际上mock_class.a会创建另一个没有规范的MagicMock。我能想到的唯一方法是将a的属性mock_class与另一个带有规范的MagicMock分配,如下所示:

mock_class = MagicMock(spec=[u'a'])
mock_class.a = MagicMock(spec=[u'a'])
hasattr(mock_class.a, u'c')  # returns False

此外,如果您想要模拟一些真实对象,则可以执行一些recursive autospecing

答案 1 :(得分:1)

您可以删除该属性,这将导致 hasattr 返回 False

来自Documentation

>>> mock = MagicMock()
>>> hasattr(mock, 'm')
True
>>> del mock.m
>>> hasattr(mock, 'm')
False
>>> del mock.f
>>> mock.f
Traceback (most recent call last):
    ...
AttributeError: f

对于您的具体示例,由于 mock_class.a 是另一个 Mock,您可以执行 del mock_class.a.c