2013-01-15 24 views
5

我正在嘗試使用factory_boy來幫助爲我的測試生成一些MongoEngine文檔。我在定義EmbeddedDocumentField對象時遇到問題。如何使用factory_boy模擬MongoEngine EmbeddedDocument?

這裏是我的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場?問題在於工廠男孩試圖創建嵌入式文檔Comment

回答

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" 

這可能不是最好的解決辦法,所以我會在接受此答案之前,請等待其他人回覆。

3

我不知道這是否是你想要什麼,但我剛開始看這個問題,這似乎工作:

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' 

,如果我失去了一些東西,雖然我也不會感到驚訝。

+0

當初始化主工廠時,您需要包含EmbeddedDocumentFactory,因爲第一個人已經包含爲嵌入式文檔工廠創建工廠。 –

相關問題