我正在尝试使用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字段吗?问题是,工厂里的普通员工试图创建Comment EmbeddedDocument。
发布于 2013-08-13 15:01:02
我不确定这是否是你想要的,但我刚开始研究这个问题,这似乎是可行的:
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-01-16 11:01:44
我现在要做的就是阻止基于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"这可能不是最好的解决方案,所以在接受这个答案之前,我会等待其他人的响应。
https://stackoverflow.com/questions/14346177
复制相似问题