Python 如何模拟类层次结构

Python 如何模拟类层次结构,python,mocking,Python,Mocking,我想模拟类的层次结构。例如: class Base(object): def one(self): return 'one' def two(self): return 'two' class Derived(Base): def three(self): return 'three' 定义基本模拟很简单: from mock import Mock def BaseMock(): mock = Mock()

我想模拟类的层次结构。例如:

class Base(object):
    def one(self):
        return 'one'
    def two(self):
        return 'two'

class Derived(Base):
    def three(self):
        return 'three'
定义基本模拟很简单:

from mock import Mock

def BaseMock():
    mock = Mock()
    mock.one.return_value = 'uno'
    mock.two.return_value = 'dos'
    return mock

def DerivedMock():
    mock = BaseMock()
    mock.three.return_value = 'tres'
    return mock
上述方法可行,但并不完整。我想使用
Mock
参数
spec
name
。我可以像往常一样在
BaseMock
中指定它们,但在
DerivedMock
中,我必须修改private
Mock
属性,这是一种糟糕的形式


是否有合适的方法模拟包含
spec
name
的类层次结构?

要模拟类层次结构,请像往常一样定义基类模拟:

from mock import Mock

def BaseMock():
    mock = Mock(spec=Base, name='BaseMock')
    mock.one.return_value = 'uno'
    mock.two.return_value = 'dos'
    return mock
在派生的mock中,实例化基本mock并(尽管它很讨厌)修改与
spec
name
相关的mock私有属性:

def DerivedMock():
    mock = BaseMock()

    # Set Mock private attributes to Derived
    mock._mock_methods.extend(dir(Derived))
    mock._mock_name = 'DerivedMock'
    mock._spec_class = Derived

    mock.three.return_value = 'tres'

    # Defining DerivedMock.four would cause a spec error
    # mock.four.return_value = 'quatro'

    return mock
现在,mock DerivedMock看起来像是类派生的,只是返回值不同:

d = DerivedMock()
assert isinstance(d, Derived)
assert repr(d).startswith("<Mock name='DerivedeMock' spec='Derived'")

assert d.one() == 'uno'
assert d.two() == 'dos'
assert d.three() == 'tres'
d=DerivedMock()
断言isinstance(d,派生)

断言repr(d).startswith("为什么你提出的方法不好?在每种方法中,你都需要构建一个
Mock
,修改
one
two
two
。那么为什么你当前的方法不好呢?@Simeon Visser:上面给出的方法是不完整的,因为
DerivedMock
没有使用Mock
specde>和
名称
参数。