【问题标题】:An easy way to mock loosely defined Python dict objects一种模拟松散定义的 Python dict 对象的简单方法
【发布时间】:2013-10-20 01:14:34
【问题描述】:

有没有一种简单的方法可以在 Python 中模拟松散定义的 dict 对象?例如,给定一个 dictinput,我如何轻松表达,我想检查其中的每个值是否符合特定的元定义,例如最小值和最大值、长度和类型?

能够做到这一点可能很方便,例如,在编写测试时。

mock(Python 3.3+ 版本中为unittest.mock)中,可以指定一个值可以是ANY 值,如

>>> mock = Mock(return_value=None)
>>> mock('foo', bar=object())
>>> mock.assert_called_once_with('foo', bar=ANY)

但是,如果上面的bar 应该是一个类似dict 的对象,比如

>>> {'baz': <an integer between -3 and 14>, 'qux': <'yes' or 'no'>}

【问题讨论】:

    标签: python unit-testing python-mock python-unittest


    【解决方案1】:

    我实际上已经编写了AnyValid,这是一个最小的库,它利用在formencodeunittest.mock 中实现的出色工作来处理此类情况。

    例如,像上面描述的那样测试一个 dict 对象,然后可以表示为

    >>> from mock import Mock
    >>> from any_valid import AnyValid, Int, OneOf
    >>> valid_bar = {
    ...     'baz': AnyValid(Int(min=-3, max=14)),
    ...     'qux': AnyValid(OneOf(['yes', 'no'])),
    ...     }
    >>> mock = Mock(return_value=None)
    >>> mock('foo', bar={'baz': 4, 'qux': 'yes'})
    >>> mock.assert_called_once_with('foo', bar=valid_bar)
    >>>
    

    因为 AnyValid 可以从 formencode 中的大量验证器中获取任何验证器,所以可以以类似的表达方式指定许多其他条件。

    【讨论】:

    • 9分钟写一个库,不错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多