Сбой тестового представления 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(), то все работает!