Skip to main content

MongoEngine 模型的假设策略

项目描述

https://travis-ci.org/gmacon/hypothesis-mongoengine.svg?branch=master

这个包包含一个假设策略,用于从MongoEngine模型生成示例文档。

这是一个最小的例子:

from hypothesis import given, note
from hypothesis_mongoengine.strategies import documents
from mongoengine import Document, StringField


class Foo(Document):
    foo = StringField()


@given(documents(Foo))
def test_something(foo):
    # Handy since the default __repr__ is unhelpful:
    note(foo.to_json())

    assert hasattr(foo, 'id')

您可以通过将每个字段的备用策略作为关键字参数传递来自定义示例的生成:

@given(documents(Foo, foo=strategies.strings(max_size=7)))
def test_another thing(foo):
    pass

默认情况下,将生成所有将根据内置 MongoEngine 限制进行验证的示例。如果该字段不是必需的,也会生成None 。如果指定了选项,则只会生成那些值。

如果指定了validation,默认的策略会被validation函数过滤掉。如果自定义验证函数接受的值太少,Hypothesis 可能无法通过健康检查。在这种情况下,请提供一个自定义验证器,以更有效地生成可接受的示例。

不支持的内容

ReferenceField通常不受支持,并且可能永远不会受支持。您可以而且应该为这些领域提供特定于应用程序的策略。这允许您确保满足应用程序所需的引用完整性约束。不要忘记 MongoEngine 期望文档在您尝试引用它们之前已保存到数据库中。您可以使用假设_mongoengine.helpers.mark_saved函数使文档看起来好像已保存。

DictField通常不受支持,可能永远不会支持。 MapField一般受支持,当值是同质的时,应该优先于DictField 。在为DictField编写自定义策略时,您可以在没有关于键的更具体的应用程序知识的情况下使用hypotheses_mongoengine.strategies.mongodb_keys策略来生成键。

DynamicDocument(和DynamicEmbeddedDocument)当前仅生成明确指定的字段。

DynamicField通常由DynamicDocument在内部使用,但是如果您有一个明确引用它的模型,则不会对其进行一般处理。

处理自定义字段

如果您的应用程序中使用了自定义字段,则可以注册一个策略以使用field_strat装饰器为其生成示例。

例如,来自extras-mongoengine的EnumField策略可能如下所示:

from extras_mongoengine.fields import EnumField
from hypothesis import strategies
from hypothesis_mongoengine.strategies import field_strat

@field_strat(EnumField)
def my_custom_strat(field):
    return strategies.sampled_from(field.enum)

通过类的相等性在注册表中查找字段,因此如果您有自定义字段的层次结构,则必须注册叶类型。但是,如果需要,您可以多次堆叠装饰器:

from extras_mongoengine.fields import EnumField, IntEnumField, StringEnumField
from hypothesis import strategies
from hypothesis_mongoengine.strategies import field_strat

@field_strat(EnumField)
@field_strat(IntEnumField)
@field_strat(StringEnumField)
def my_custom_strat(field):
    return strategies.sampled_from(field.enum)

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

假设-mongoengine-1.1.0.tar.gz (4.7 kB 查看哈希)

已上传 source

内置分布

假设_mongoengine-1.1.0-py2.py3-none-any.whl (7.8 kB 查看哈希

已上传 py2 py3