MagicMock 对象的子类有奇怪的 spec='str' 并且不能使用或模拟该类的方法

问题描述 投票:0回答:1

当从 MagicMock() 对象派生的类被创建时,它有一个不需要的 spec='str'。有谁知道为什么会这样?有谁知道在这种情况下可以对 MagicMock() 对象执行的任何操作,以至于它没有 spec='str' 或者可以使用类的方法?

from unittest.mock import MagicMock

a = MagicMock()

class b():
    @staticmethod
    def x():
        return 1

class c(a):
    @staticmethod
    def x():
        return 1
print(a)
print(b)
print(c)
print(a.x())
print(b.x())
print(c.x())

返回

MagicMock id='140670188364408'>
<class '__main__.b'>
<MagicMock spec='str' id='140670220499320'>
<MagicMock name='mock.x()' id='140670220574848'>
1
Traceback (most recent call last):
    File "/xyz/test.py", line 19, in <module>
        print(c.x())
    File "/xyz/lib/python3.7/unittest/mock.py", line 580, in _getattr_
        raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'x'

基本上我需要 AttributeError 不在这里。我可以对“a”做些什么使 c.x() 有效吗?

edit - 问题似乎出在 mock.py 中的 _mock_add_spec 仍然不确定如何解决这个问题。

python python-3.x python-unittest python-unittest.mock magicmock
1个回答
-1
投票

有趣...

你面临的问题是因为 MagicMock 对象有一个“spec”属性,它只允许属于指定对象一部分的方法。在这种情况下,“spec”设置为“str”,因此只允许使用“str”类的方法。

要解决这个问题,您可以创建没有“spec”属性的 MagicMock 对象,或者将“spec”属性设置为“None”,这将允许所有方法:

from unittest.mock import MagicMock

a = MagicMock(spec=None)  # or a = MagicMock()

class b():
    @staticmethod
    def x():
        return 1

class c(a):
    @staticmethod
    def x():
        return 1

print(a)
print(b)
print(c)
print(a.x())
print(b.x())
print(c.x())

这应该允许在不引发“AttributeError”的情况下调用“c.x()”方法。还要小心配置错误的模拟!

© www.soinside.com 2019 - 2024. All rights reserved.