我有一行代码:
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,但它被嘲笑!!!
答案 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
。
>>> 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
。