我想模拟类的层次结构。例如:
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 并(尽管它很可恶)修改 Mock 私有(private)属性相关的 spec
和 name
:
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 看起来像 class Derived,只是返回值不同:
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'
关于python - 如何模拟类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542504/