7

factory_boy を使用して、テスト用の MongoEngine ドキュメントを生成しようとしています。オブジェクトの定義に問題がありEmbeddedDocumentFieldます。

これが私のMongoEngineDocumentです:

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_boyFactoryです:

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問題は、factory-boy がEmbeddedDocumentを作成しようとすることです。

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 に答える