如何模拟缺少的属性

Phi*_*out 7 python mocking

我有一行代码:

if not hasattr(class.a, u'c'):
    return
Run Code Online (Sandbox Code Playgroud)

如何模拟类,以便class.ac为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
Run Code Online (Sandbox Code Playgroud)

虽然我没有指定class.ac,但它被嘲笑!

小智 6

实际上mock_class.a会创建另一个没有规格的MagicMock.我能想到的唯一的办法就是属性指定amock_class与规范,这样其他MagicMock:

mock_class = MagicMock(spec=[u'a'])
mock_class.a = MagicMock(spec=[u'a'])
hasattr(mock_class.a, u'c')  # returns False
Run Code Online (Sandbox Code Playgroud)

此外,如果您想要模拟一些真实对象,则可以进行一些递归自动调整.


Kyl*_*yle 6

您可以删除该属性,这将导致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
Run Code Online (Sandbox Code Playgroud)

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