Django - 'В текущей транзакции произошла ошибка. Вы не можете выполнять запросы до конца блока 'atomic'.' на очень простом тесте
Я использую Django 3.2.9 с postgres. У меня есть очень простой тест ниже, который генерирует несколько данных из списка, как вы можете видеть, исключение вызвано GoalCategory.objects.create(name=goal_name, emoji='url')
. Я вижу, что здесь есть некоторые решения:
В текущей транзакции произошла ошибка. Вы не можете выполнять запросы до конца 'атомного' блока
Мой тест, как вы можете видеть, очень прост, и решение заключается в том, чтобы обернуть 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)