Nam*_*Ngo 10 python testing django factory fixtures
我目前正在使用factory_boy
我的测试中创建灯具.
Factory_boy
docs仅提到了SubFactory
哪些可能就像ForeignKey
模型中的字段一样.但是,ManyToMany协会没有任何内容.如果我有一个以下Post模型,我将如何为它创建一个工厂?
class Post(models.Model):
title = models.CharField(max_length=100)
tags = models.ManyToManyField('tags.Tag')
class PostFactory(factory.Factory):
FACTORY_FOR = Post
title = 'My title'
tags = ???
Run Code Online (Sandbox Code Playgroud)
lec*_*hup 11
怎么样post_generation钩子 - 我假设你使用较新版本的factory_boy?
import random
import factory
class PostFactory(factory.Factory):
FACTORY_FOR = Post
title = factory.Sequence(lambda n: "This is test title number" + n)
@factory.post_generation(extract_prefix='tags')
def add_tags(self, create, extracted, **kwargs):
# allow something like PostFactory(tags = Tag.objects.filter())
if extracted and type(extracted) == type(Tag.objects.all()):
self.tags = extracted
self.save()
else:
if Tag.objects.all().count() < 5:
TagFactory.create_batch(5, **kwargs)
for tag in Tag.objects.all().order_by('?')[:random.randint(1, 5)]:
self.tags.add(tag)
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用PostFactory(tags__field = 'some fancy default text')
,但我建议TagFactory
使用序列创建好...
你应该能够绑定PostFactory(tags = Tag.objects.filter())
但是这部分没有经过测试......
您可以覆盖_prepare
classmethod:
class PostFactory(Factory):
FACTORY_FOR = Post
title = 'My title'
@classmethod
def _prepare(cls, create, **kwargs):
post = super(PostFactory, cls)._prepare(create, **kwargs)
if post.id:
post.tags = Tag.objects.all()
return post
Run Code Online (Sandbox Code Playgroud)
请注意,如果帖子没有ID,则无法为帖子添加标签.
我没有测试过,但是问题出在哪里:
class PostFactory(factory.Factory):
FACTORY_FOR = Post
title = 'My title'
class TagFactory(factory.Factory):
FACTORY_FOR = Tag
post = PostFactory()
tag = TagFactory()
post.tags.add(tag)
Run Code Online (Sandbox Code Playgroud)