工厂男孩和相关对象的创建

Dav*_* D. 3 python django unit-testing factory factory-boy

假设您具有以下相关的Django模型:

class Service:
   restaurant = models.ForeignKey(Restaurant)
   hist_day_period = models.ForeignKey(DayPeriod)

class DayPeriod:
   restaurant = models.ForeignKey(Restaurant)
Run Code Online (Sandbox Code Playgroud)

我想Service使用Factory 创建一个对象。它应该创建所有3个模型,但使用一家餐厅。

使用此代码:

class ServiceFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Service

    restaurant = factory.SubFactory('restaurants.factories.RestaurantFactory')

    hist_day_period = factory.SubFactory(
        'day_periods.factories.DayPeriodFactory', restaurant=restaurant)
Run Code Online (Sandbox Code Playgroud)

工厂男孩将创建2家不同的餐厅:

s1 = ServiceFactory.create()
s1.restaurant == s1.hist_day_period.restaurant
>>> False
Run Code Online (Sandbox Code Playgroud)

关于如何执行此操作的任何想法?我不清楚我是否应该使用related factors而不是SubFactory完成此操作。

din*_*ltz 6

您想使用factoryboy的父母SelfAttribute

class ServiceFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Service

    restaurant = factory.SubFactory('restaurants.factories.RestaurantFactory')

    hist_day_period = factory.SubFactory(
        'day_periods.factories.DayPeriodFactory',
        restaurant=factory.SelfAttribute('..restaurant')
    )
Run Code Online (Sandbox Code Playgroud)

有了这个测试应用程序,我得到了

In [1]: from service.tests import ServiceFactory
In [2]: s1 = ServiceFactory.create()
In [3]: s1.restaurant == s1.hist_day_period.restaurant
Out[3]: True

In [4]: s1.restaurant_id
Out[4]: 4

In [5]: s1.hist_day_period.restaurant_id
Out[5]: 4
Run Code Online (Sandbox Code Playgroud)