2012-04-23 14 views
10

Şu anda testlerimde fikstür oluşturmak için factory_boy kullanıyorum. Factory_boy Yalnızca, bir modelde ForeignKey alanı gibi davranabilecek SubFactory numaralı belgeden bahsetmişlerdir. Ancak, ManyToMany derneğinde hiçbir şey yoktu. Sonraki bir Post modelim olsaydı, bunun için bir fabrika oluşturmaya nasıl giderim?Python factory_boy kütüphanesi m2m?

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 = ??? 
+0

Hey @Ngo çalıştı bir cevap aldın mı? – Daryl

+0

@Daryl: _prepare overriding en kolay çözüm gibi görünüyor :) –

cevap

2

bunu test etmedi, ama sorun ne: Eğer etiket ekleyemezsiniz

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 

Not: _prepare classmethod geçersiz kılabilir

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) 
+1

Evet, işe yarıyor. Ama şunu yapmak istiyorum: post = PostFactory() ve post.tags.add (tag) –

+0

'u manuel olarak belirtmek zorunda kalmadan otomatik olarak eklenen 4 etiketin olacağını söyleyebilirim. Ama neden sadece bunu sizin için yapan bir işlev yaratmıyorsunuz? def PostFactoryWithFourTags(): sonrası = PostFactory() xrange için _ (4): post.tags.add (TagFactory() dönüş sonrası – Ale

7

Gönderinin bir kimliği yoksa bir gönderi.

11

post_generation hook hakkında - factory_boy'un daha yeni bir sürümünü mi kullanıyorsunuz? Benim Sıralarla iyi TagFactory oluşturmak için tavsiye ama, PostFactory(tags__field = 'some fancy default text') kullanabilirsiniz

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) 

Not ...

Sen PostFactory(tags = Tag.objects.filter()) bağlamak gerekir ama bu kısmı test değildir ...