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

#django #unit-testing #django-class-based-views

Вопрос:

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

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

Чтобы проверить, не создает ли пациент CBV, я пишу запрос на публикацию и проверяю, увеличивается ли количество пациентов на одного. Но этот тест не пройдет, даже если я войду в систему с помощью «администратора». Похоже, что пациент не создан в тестовой базе данных.

Обратите внимание, что 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')  # =gt; 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) # =gt; 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) # =gt; return False  

ecrf/мнения

 @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)  

Ответ №1:

На самом деле, я понял, что тестирование 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, и я не знаю, почему.

Но проверка пароля пользователя, созданного в методе установки с помощью метода check_password (), завершается неудачей. Но если я создам пользователя с помощью метода create() и установлю пароль пользователя «вручную» с помощью метода set_password (), это сработает!