首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用factory_boy为MongoEngine EmbeddedDocument建模?

如何使用factory_boy为MongoEngine EmbeddedDocument建模?
EN

Stack Overflow用户
提问于 2013-01-16 04:22:32
回答 2查看 977关注 0票数 7

我正在尝试使用factory_boy来帮助为我的测试生成一些MongoEngine文档。我在定义EmbeddedDocumentField对象时遇到问题。

这是我的MongoEngine Document

代码语言:javascript
复制
class Comment(EmbeddedDocument):
    content = StringField()
    name = StringField(max_length=120)

class Post(Document):
    title = StringField(required=True)
    tags = ListField(StringField(), required=True)
    comments = ListField(EmbeddedDocumentField(Comment))

这是我的部分完成的factory_boy Factory

代码语言:javascript
复制
class CommentFactory(factory.Factory):
    FACTORY_FOR = Comment
    content = "Platinum coins worth a trillion dollars are great"
    name = "John Doe"

class BlogFactory(factory.Factory):
    FACTORY_FOR = Blog
    title = "On Using MongoEngine with factory_boy"
    tags = ['python', 'mongoengine', 'factory-boy', 'django']
    comments = [factory.SubFactory(CommentFactory)] # this doesn't work

你知道如何指定comments字段吗?问题是,工厂里的普通员工试图创建Comment EmbeddedDocument。

EN

回答 2

Stack Overflow用户

发布于 2013-08-13 15:01:02

我不确定这是否是你想要的,但我刚开始研究这个问题,这似乎是可行的:

代码语言:javascript
复制
from mongoengine import EmbeddedDocument, Document, StringField, ListField, EmbeddedDocumentField
import factory

class Comment(EmbeddedDocument):
    content = StringField()
    name = StringField(max_length=120)

class Post(Document):
    title = StringField(required=True)
    tags = ListField(StringField(), required=True)
    comments = ListField(EmbeddedDocumentField(Comment))


class CommentFactory(factory.Factory):
    FACTORY_FOR = Comment
    content = "Platinum coins worth a trillion dollars are great"
    name = "John Doe"

class PostFactory(factory.Factory):
    FACTORY_FOR = Post
    title = "On Using MongoEngine with factory_boy"
    tags = ['python', 'mongoengine', 'factory-boy', 'django']
    comments = factory.LazyAttribute(lambda a: [CommentFactory()])

>>> b = PostFactory()
>>> b.comments[0].content
'Platinum coins worth a trillion dollars are great'

不过,如果我错过了什么,我也不会感到惊讶。

票数 5
EN

Stack Overflow用户

发布于 2013-01-16 11:01:44

我现在要做的就是阻止基于EmbeddedDocuments的工厂的构建。因此,我设置了一个EmbeddedDocumentFactory,如下所示:

代码语言:javascript
复制
class EmbeddedDocumentFactory(factory.Factory):

    ABSTRACT_FACTORY = True

    @classmethod
    def _prepare(cls, create, **kwargs):                                        
        return super(EmbeddedDocumentFactory, cls)._prepare(False, **kwargs)

然后我继承了它,为EmbeddedDocuments创建工厂:

代码语言:javascript
复制
class CommentFactory(EmbeddedDocumentFactory):

    FACTORY_FOR = Comment

    content = "Platinum coins worth a trillion dollars are great"
    name = "John Doe"

这可能不是最好的解决方案,所以在接受这个答案之前,我会等待其他人的响应。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14346177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档