FactoryBoy / Django - обработка констант - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю фабрику для следующей модели Django:

class Book(models.Model):
    tenant = models.ForeignKey('elearning.Tenant')
    book_id = models.IntegerField()
    ean = models.CharField(max_length=13, null=False)
    title = models.CharField(verbose_name="titel", max_length=200)
    author_name = models.CharField(max_length=200)
    description = models.TextField()
    price_id = models.IntegerField()
    buy_option_text = models.CharField(max_length=50)
    loan_days = models.IntegerField(null=True)
    type = 'Yindoboek'

, которую я превратил в эту фабрику:

class BookFactory(factory.django.DjangoModelFactory):

    class Meta:
        model = Book

    tenant = factory.SubFactory(TenantFactory)
    book_id = factory.LazyFunction(lambda: random.randint(1, 1000))
    ean = factory.LazyFunction(
        lambda: ''.join(
            random.choice(string.ascii_uppercase) for _ in range(6)
        ) + ''.join(random.choice(string.digits) for _ in range(6))
    )
    title = factory.Faker('company')
    author_name = factory.Faker('name_male')
    description = factory.Faker('text')
    price_id = factory.LazyFunction(lambda: random.randint(1, 1000))
    buy_option_text = factory.Faker('sentence')
    loan_days = factory.LazyFunction(lambda: random.randint(1, 150))
    type = 'Yindoboek'

Однако, когда я пытаюсь запустить следующий тест:

    def test_factory_matches_model(self):
        """ Verify that the factory generates a valid Book instance """
        self.assertTrue(self.book)
        self.assertTrue(self.book.tenant)

Вылетает со следующей ошибкой:

TypeError: 'type' is an invalid keyword argument for this function

Кажется, FactoryBoy отключает поле type в модели Book, который является не экземпляром поля Django, а константой.

Если я исключу это поле из фабрики, тест будет пройден - но я бы предпочел не удалять поля (все дело в том, чтобы проверить все поля / комбинации) - поэтому мне было интересно, был ли способ обойтиэта проблема, кто-нибудь знает решение?

1 Ответ

0 голосов
/ 12 апреля 2019

Я нашел ответ:

Согласно документации неполевые параметры должны быть помещены в отдельный Params класс.

Чтобы рабочая модель выгляделакак это:

class BookFactory(factory.django.DjangoModelFactory):

    class Meta:
        model = Book

    tenant = factory.SubFactory(TenantFactory)
    book_id = factory.LazyFunction(lambda: random.randint(1, 1000))
    ean = factory.LazyFunction(
        lambda: ''.join(
            random.choice(string.ascii_uppercase) for _ in range(6)
        ) + ''.join(random.choice(string.digits) for _ in range(6))
    )
    title = factory.Faker('company')
    author_name = factory.Faker('name_male')
    description = factory.Faker('text')
    price_id = factory.LazyFunction(lambda: random.randint(1, 1000))
    buy_option_text = factory.Faker('sentence')
    loan_days = factory.LazyFunction(lambda: random.randint(1, 150))

    class Params:
        type = 'Yindoboek'
...