python-3.x MagicMock对象的子类具有奇怪的spec='str',无法使用或模拟该类的方法

ef1yzkbh  于 2023-02-14  发布在  Python
关注(0)|答案(1)|浏览(135)

当一个类是从一个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()有效吗?

jk9hmnmh

jk9hmnmh1#

有意思...
您所面临的问题是因为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())

这应该允许"c. x()"方法被调用而不引发"AttributeError"。还要小心配置错误的模拟!

相关问题