Задать вопрос
@EgorLee

Как проводить тесты моделей, где в переопределенном .save() сохранение используется 2 раза?

У меня есть модель категории, для идентификации ее в телеграм боте, я использую поле pk_for_telegram, куда записывается строчка, содержащий id категории. Соответственно id появляется только после сохранения экземпляра, мое решение такое:

class Category(models.Model):
    '''Модель категорий'''
    name = models.CharField(max_length=255, help_text='Имя категории')
    photo = models.ImageField(upload_to='category_img/', help_text='Фото категории')
    slug = models.SlugField(max_length=100, unique=True)
    pk_for_telegram = models.CharField(max_length=255, unique=True, blank=True, null=True, help_text='Используется в боте для поиска категории')    # Нужен для идентификации в телеграм боте
    max_count_product = models.IntegerField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)
        self.pk_for_telegram = f'c||{self.pk}'
        super(Category, self).save(*args, **kwargs)

    def __str__(self):
        return self.name


В приложении это работает правильно. Но я захотел покрыть свой код тестами, и встретился с такой ошибкой, из за того что метод save() используется 2 раза, он пробует сохранить экземпляр 2 раза и бросает ошибку

django.db.utils.IntegrityError: UNIQUE constraint failed: main_app_category.id


При комментировании одного из .save() все проходит успешно, как решить этот вопрос?
Модель теста:
class ListProductViewTest(TestCase):

    def setUp(self) -> None:
        self.seller_user = User.objects.create(username='seller1', password='password')
        self.super_user = User.objects.create(username='admin1', password='password', is_staff=True)
        image = SimpleUploadedFile('image.jpg', content=b'', content_type='image/jpg')
        self.category = Category.objects.create(name='category', photo=image, max_count_product=10)
        self.subcategory = SubCategory.objects.create(name='subcategory', photo=image, category=self.category)
        self.product = Product.objects.create(title='product', photo=image, price=Decimal('100.00'), count=10, weight=100, description='descrpit',  subcategory=self.subcategory, )

    
    def test_seller_requared(self):
        factory = RequestFactory()
        request = factory.get('')
        request.user = self.seller_user
        response = IndexView.as_view()(request)
        self.assertEqual(response.status_code, 302)

    def test_admin_requared(self):
        factory = RequestFactory()
        request = factory.get('')
        request.user = self.super_user
        response = IndexView.as_view()(request)
        self.assertEqual(response.status_code, 200)
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ты в setUp() не очищаешь тестовую базу? Т.е. к моменту второго теста у тебя остаются данные после первого?
Это плохая идея.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы