11

我有一行代码是:

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

如何模拟类以便 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

虽然我不指定class.ac,但它被嘲笑了!!!

4

2 回答 2

10

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

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

此外,如果您有一些要模拟的真实对象,则可以进行一些递归 autospecing

于 2013-07-19T21:03:07.263 回答
3

您可以删除该属性,这将导致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.

于 2021-01-19T18:30:29.627 回答