После обновления Django завершились тесты модулей

Я пытаюсь запустить проект Django с версии 1.8 до 1.11. Похоже, что все работает нормально, кроме модульных тестов. У нас есть базовый тестовый класс, наследующий от Django TestCase с помощью Tastypie mixin. Базовый класс имеет некоторый код в setUp(), подобный этому

class BaseApiTest(ResourceTestCaseMixin, django.test.TestCase):
    def setUp(self):
        super().setUp()
        self.username = "secret_user"
        self.password = "sekret"
        self.email = "[email protected]"
        self.first_name = "FirstName"
        self.last_name = "LastName"
        self.user = User.objects.create_superuser(
            self.username,
            self.username,
            self.password
        )

И специальные тесты приложения наследуют базовый тест и делают что-то вроде

class TheAPITest(BaseApiTest):
    def setUp(self):
        super().setUp()
        # more setup goes here

Итак, под Django 1.8.x это отлично работает. Но под 1.11.x все это дает мне ошибку на User.objects.create_superuser() line.

django.db.utils.InterfaceError: connection already closed

Я просматриваю заметки о выпуске, но есть слишком много вещей, которые произошли между 1,8 и 1.11. Есть что-то простое, что мне не хватает?

Ответы

Ответ 1

Я обнаружил несколько проблем с моим охватом unit test, но, чтобы ответить на вопрос, который я опубликовал, две отдельные проблемы вызывают ошибки, которые я описал.

Django 1.11 более строг в создании своего экземпляра модели, и у нас есть некоторый старый тестовый код, который не был обновлен до новой структуры модели. Например, если вы используете модель User по умолчанию, в Django 1.8 вы можете сделать

from django.contrib.auth.models import User    
User.objects.create(username="something", password="something", something="something")

Но в Django 1.11 он вызывает исключение "TypeError: 'something' is an invalid keyword argument for this function".

И вторая проблема заключается в том, что Django TestCase обертывает тестовые примеры двумя отдельными атомными блоками. Это помогает сохранить настройку уровня класса отдельно от настройки уровня экземпляра, но также создает тонкую проблему. Если тест сбой с ошибкой базы данных, вы никогда не увидите ошибку, потому что она происходит на тестовом уровне атома, а не в атомном классе. Атомный уровень уровня завершен, и соединение с базой данных отключено. После этого каждый тест будет терпеть неудачу с точной ошибкой django.db.utils.InterfaceError: connection already closed, которую я видел. Переключение с TestCase на TransactionTestCase привело к тому, что многие из этих проблем были выставлены непосредственно в тестовом выпуске.

Ответ 2

Может быть полезно иметь трассировку ошибок. Но на данный момент в коде я вижу эту ошибку:

   self.user = User.objects.create_superuser(
                self.username,
                self.username, **this should be self.email**
                self.password
            )