python - 如何模拟类层次结构

标签 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()
    mock.one.return_value = 'uno'
    mock.two.return_value = 'dos'
    return mock

def DerivedMock():
    mock = BaseMock()
    mock.three.return_value = 'tres'
    return mock

上面的工作,但它是不完整的。我想使用 Mock 参数 specname。我可以像往常一样在 BaseMock 中指定它们,但在 DerivedMock 中,我必须修改私有(private) Mock 属性,这是错误的形式。

是否有适当的方法来模拟具有 specname 的类层次结构?

最佳答案

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

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)属性相关的 specname:

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/

相关文章:

python - 在Python中将字符串按空格分割成最大长度的子字符串

javascript - 使用 NightmareJS 模拟内置对象

java - 模拟 Java InputStream

java - 使用 Mockito 来模拟某些方法,但不能模拟其他方法

c# - 我如何使用 Caller Info 属性进行 TDD?

javascript - 使用 Nock 模拟 NodeJS 请求和响应

python - 如何使用 pandas 数据框计算每个单元格的百分比并用结果(%)替换该值?

python - 列表理解 : is there a concise way to refer to the initial expression in the if condition?

python - 循环遍历 2 个 Pandas Dataframes 并将行值传递给计算距离的函数

python - pandas 获取不在其他数据框中的行