Как создать тестовый пример с помощью Factory boy? Django
Я пытаюсь протестировать свой код с помощью factory boy, но все равно получаю ошибки типа
"django.db.utils.IntegrityError: UNIQUE constraint failed: auth_user.username " или
"Строка в таблице 'analytics_event' с первичным ключом '1' имеет недопустимый внешний ключ: analytics_event.created_by_id содержит значение '7', которое не имеет соответствующего значения в auth_user.id"
моя модель:
class Event(models.Model):
name = models.CharField('the name of the event', max_length=255)
created_at = models.DateTimeField(default=timezone.now, validators=[LessThanNowValidator()])
additional_data = models.CharField(max_length=300, blank=True, default='')
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f"{self.name}"
class CustomUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
api_token = models.CharField(max_length=100, blank=True, null=True, unique=True)
def __str__(self):
return f"{self.user.username}"
Я пытаюсь протестировать с помощью factory boy:
class EventFactory(factory.django.DjangoModelFactory):
class Meta:
model = Event
created_by = None
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
username = factory.Sequence(lambda n: "User %d" % n)
@factory.post_generation
def user_related_models(obj, create, extracted, **kwargs):
if not create:
return
EventFactory.create(
created_by=obj
)
john = UserFactory.create()
class EventTestCase(TestCase):
def test_post(self):
self.assertEquals(
Event.objects.count(),
0
)
Event.objects.create(
name='event1', created_by=john
)
self.assertEquals(
Event.objects.count(),
1
)
Переместите john = UserFactory.create()
в EventTestCase
setUpTestData(cls)
.
# john = UserFactory.create() # Replace this
class EventTestCase(TestCase):
@classmethod # with this
def setUpTestData(cls): #
cls.john = UserFactory.create() #
def test_post(self):
self.assertEquals(
Event.objects.count(),
0
)
Event.objects.create(
# name='event1', created_by=john # Replace this
name='event1', created_by=self.john # with this
)
self.assertEquals(
Event.objects.count(),
1
)
Пояснение
"django.db.utils.IntegrityError: UNIQUE constraint failed: auth_user.username"
Это происходит из-за создания пользователя с тем же именем пользователя "User 0"
при каждом импорте модуля.
"Строка в таблице 'analytics_event' с первичным ключом '1' имеет недопустимый внешний ключ: analytics_event.created_by_id содержит значение '7', которое не имеет соответствующего значения в auth_user.id."
Это вызвано тем, что Django TestCase
промывает базу данных в начале каждого теста.
From https://docs.djangoproject.com/en/3.2/topics/testing/tools/:
В начале каждого теста, перед запуском
setUp()
, Django будет промывать базу данных, возвращая ее в состояние, в котором она находилась непосредственно после вызоваmigrate
.