Сбой тестового представления Django: (1) не удается войти в систему новому созданному пользователю и (2) тест CBV create view не создает объект в тестовой базе данных

У меня есть проект Django, и я хочу внедрить модульные тесты. Я хочу протестировать представление на основе класса (CBV) под названием PatientCreate, которое должно быть аутентифицировано. Важно отметить, что тестовая база данных sqlite уже заполнена пользователями (миграция данных).

В классе PatientTestCase я начинаю определять настройку, в которой создается новый суперпользователь с именем 'test' и регистрируется новый созданный пользователь. Затем я проверяю, вошел ли пользователь 'test' в систему, но тест не проходит. Если вошел пользователь, уже зарегистрированный в базе данных теста (т.е. пользователь с именем 'admin'), тест проходит успешно.

Для проверки PatientCreate CBV я пишу пост-запрос и проверяю, увеличивается ли количество пациентов на одного. Но этот тест не проходит, даже если я вошел в систему под именем 'admin'. Похоже, что пациент не создан в тестовой базе данных.

Обратите внимание, что response.status_code = 200.

Я не могу понять, откуда взялась моя проблема.

архитектура проекта

- core
   - urls.py
- ecrf
   - urls.py
   - views.py

tests.py

class PatientTestCase(TestCase):

    def setUp(self):
        self.client = Client()
        self.user = User.objects.create_superuser(
            username='test', password='test', email='test@test.fr')
        # => print(self.user) return test so user is created
        self.login_success = self.client.login(username='test', password='test')

    def test_new_patient_is_created(self):
        self.assertTrue(self.login_success)  # => return False with 'test' but will success with 'admin'
        patient_site = Site.objects.get(sit_ide=4)
        number_of_patients_before = Patient.objects.count()
        response = self.client.post(reverse('ecrf:patient_create'), {
            'pat': 'TES001',
            'pat_sit': patient_site
        }, follow=True, HTTP_ACCEPT_LANGUAGE='fr')
        number_of_patients_after = Patient.objects.count()
        self.assertEqual(number_of_patients_after,
                         number_of_patients_before + 1)  # => return False

ecrf/views

@method_decorator(login_required, name="dispatch")
class PatientCreate(SuccessMessageMixin, CreateView):

    model = Patient
    form_class = PatientForm
    success_message = "Le patient a été créé."

    def get_success_url(self):

        return reverse("ecrf:index")

    def form_valid(self, form):
        form.instance.pat_sai_log = self.request.user.username
        form.save()
        return super().form_valid(form)

На самом деле, я понял, что тестирование CBV явно отличается от FBV. Ниже приведено мое решение, надеюсь, оно поможет и будет правильным:

class CBVCreateViewTestCase(TestCase):
    
    def setUp(self):
        self.user = User.objects.create_superuser(username='test', password='test', email='test@test.fr')
        self.data= {...}

    def test_object_is_created(self):

        condition_before = ...
        request = RequestFactory().post(reverse('app_name:view_name'), self.data,
                                        follow=True, HTTP_ACCEPT_LANGUAGE='fr')
        # logged-in user
        request.user = self.user
        
        # call to CBV
        response = CBVCreateView.as_view()(request)
        condition_after = ...

        # Test condition_before and condition_after

Решение проблемы входа в систему с FBV заключается в том, что создание суперпользователя с помощью функции create_superuser() приводит к тому, что пароль не хэшируется должным образом в unitest, и я не знаю почему.

Но проверка пароля пользователя, созданного в методе setup, методом check_password() не срабатывает. Но если я создаю пользователя методом create() и устанавливаю пароль пользователя "вручную" методом set_password(), то все работает!

Вернуться на верх