7

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

这是我的 MongoEngine Document

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

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字段?问题是工厂男孩试图创建CommentEmbeddedDocument。

4

2 回答 2

5

我不确定这是否是您想要的,但我刚刚开始研究这个问题,这似乎有效:

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'

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

于 2013-08-13T07:01:01.640 回答
2

我现在这样做的方式是防止构建基于 EmbeddedDocuments 的工厂。所以,我设置了一个 EmbeddedDocumentFactory,如下所示:

class EmbeddedDocumentFactory(factory.Factory):

    ABSTRACT_FACTORY = True

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

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

class CommentFactory(EmbeddedDocumentFactory):

    FACTORY_FOR = Comment

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

这可能不是最好的解决方案,所以我会等待其他人回复,然后再接受这个作为答案。

于 2013-01-16T03:01:43.830 回答