我有一行代码是:

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,但它被 mock 了!!!

最佳答案

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

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

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

10-08 07:03