Я пишу тесты для приложения Django, и в настоящее время я столкнулся со следующей проблемой:
У меня есть эта (абстрактная) модель:
class HeroContent(models.Model):
title = models.CharField(
max_length=100, blank=True, null=True,
default=None)
subtitle = models.CharField(
max_length=255, blank=True, null=True,
default=None)
class Meta:
abstract = True
Для чего я создал следующую фабрику:
class HeroContentFactory(factory.DjangoModelFactory):
class Meta:
model = HeroContent
abstract = True
title = factory.Faker('company')
subtitle = factory.Faker('company')
Я проконсультировался с документация о том, как обращаться с абстрактными моделями, но когда я запускаю следующий тест:
class HeroContentFactoryTest(TestCase):
def test_init(self):
hero_content = HeroContentFactory()
Возникает следующая ошибка:
FactoryError: Cannot generate instances of abstract factory HeroContentFactory; Ensure HeroContentFactory.Meta.model is set and HeroContentFactory.Meta.abstract is either not set or False.
Но это, похоже, прямо противоречит курсу, рекомендованному в официальной документации, в котором говорится, что когда
If a DjangoModelFactory relates to an abstract model, be sure to declare the DjangoModelFactory as abstract
Удаление настройки abstract = True
с завода
Выдает следующую ошибку:
AttributeError: 'NoneType' object has no attribute 'create'
вызов .create
для абстрактной модели, конечно же, должен завершиться неудачно, но теперь мне интересно, как правильно протестировать такие модели с использованием фабрики, особенно потому, что курс, предложенный в документации, не работает для меня.
Кто-нибудь знает, что я делаю неправильно?
Вам нужно наследоваться от HeroContentFactory
в HeroContentConcreteFactory
, который будет привязан к подклассу HeroContent
, который будет конкретной моделью. Вы не можете создать экземпляр из абстрактной модели или абстрактной фабрики.