#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 (), это сработает!