Django - 'В текущей транзакции произошла ошибка. Вы не можете выполнять запросы до конца блока 'atomic'.' на очень простом тесте

Я использую Django 3.2.9 с postgres. У меня есть очень простой тест ниже, который генерирует несколько данных из списка, как вы можете видеть, исключение вызвано GoalCategory.objects.create(name=goal_name, emoji='url'). Я вижу, что здесь есть некоторые решения:

TransactionManagementError "You can't execute queries until end of the 'atomic' block" при использовании сигналов, но только во время Unit Testing

В текущей транзакции произошла ошибка. Вы не можете выполнять запросы до конца 'атомного' блока

Мой тест, как вы можете видеть, очень прост, и решение заключается в том, чтобы обернуть create в transaction.atomic, что кажется излишним, учитывая, насколько проста моя генерация тестовых данных. Есть ли лучшее решение для этого? Мне не нравится обертывать его в try и except, потому что тогда данные, которые я ожидаю от теста, могут быть не сгенерированы, а просто пропущены, потому что они пойманы try except.

Другим предложенным решением было изменить TestCase на TransactionTestCase, что действительно решило проблему, но вы не можете установить self с TransactionTestCase, как вы можете видеть, я установил переменную access_token. Этот атрибут удаляется из self, когда я перехожу к test_search_categories.

Итак, ошибка, которую я получаю, An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block. и она вызвана этой строкой GoalCategory.objects.create(name=goal_name, emoji='url').

from django.test import TestCase
from django.urls import reverse
from rest_framework import status

from cheers.models import GoalCategory
from cheers.test.test_helpers import create_test_user_in_DB, get_test_user_access_token


class GoalCategorySearchTest(TestCase):
    @classmethod
    # Generates Test DB data to persist throughout all tests
    def setUpTestData(cls) -> None:
        cls.access_token = get_test_user_access_token()
        cls.user = create_test_user_in_DB()
        cls.goal_category_name_list = ['health', 'fitness', 'art', 'relationships']

        for goal_name in cls.goal_category_name_list:
            GoalCategory.objects.create(name=goal_name, emoji='url')

    def test_search_categories(self):
        response = self.client.get(reverse('goal_category_search',
                                           kwargs={'input_str': 'heal'}),
                                   content_type='application/json',
                                   **{'HTTP_AUTHORIZATION': f'bearer {self.access_token}'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
Вернуться на верх