Как обновить объект модели при тестировании UpdateView Django
У меня возникают некоторые проблемы, когда я тестирую представление обновления в моем коде.Вот представление:
class PatientUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
permission_required = 'main.change_patient'
model = Patient
template_name = 'patient/edit_patient.html'
form_class = PatientUpdateForm
А это модель пациента:
class Patient(models.Model):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False
)
first_name = models.CharField(max_length=50, blank=False)
last_name = models.CharField(max_length=50, blank=False)
middle_name = models.CharField(max_length=50, blank=True, default='')
hospital_number = models.IntegerField(unique=True, default=0)
age = models.IntegerField(blank=False)
sex = models.CharField(max_length=6, choices=gender_choices, default='female')
weight = models.CharField(max_length=10, choices=gender_choices, default='female')
def __str__(self):
return f' {self.hospital_number} --> {self.first_name} {self.last_name}'
def get_absolute_url(self):
return reverse('patient_detail', args=[str(self.id)])
Вот форма:
class PatientUpdateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PatientUpdateForm, self).__init__(*args, **kwargs)
gender_choices = [
('male', 'Male'),
('female', 'Female')
]
marriage_choices = [
('married', 'Married'),
('single', 'Single')
]
self.fields['gender'] = forms.ChoiceField(choices=gender_choices)
self.fields['marriage_status'] = forms.ChoiceField(choices=marriage_choices)
class Meta:
model = Patient
fields = [
'first_name', 'last_name', 'hospital_number',
'age', 'sex', 'weight'
]
И тестовый пример:
class PatientsTest(TestCase):
def setUp(self):
self.superuser = get_user_model().objects.create_user(
email='genuis@gmail.com',
username='supergenius',
password='password',
is_superuser = True
)
def test_patient_update_view(self):
data = {
'first_name':'Joe',
'sex' :'female',
}
new_patient = Patient.objects.create(
first_name='John',
last_name = 'doe',
hospital_number = 2,
age=24,
sex = 'male',
weight='79 Kg',
)
self.client.login(username=self.superuser.username, password='password')
response = self.client.post(reverse('patient_edit', kwargs={'pk': new_patient.id}), data)
self.assertEqual(response.status_code, 302) # should go through for superusers, response code should be 302 but returns 200
new_patient.refresh_from_db()
self.assertEqual(new_patient.first_name, 'Joe')
self.assertEqual(new_patient.sex, 'female')
self.client.logout()
Тест завершается неудачей со следующим сообщением:
FAIL: test_patient_update_view (main.tests.PatientsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/app/main/tests.py", line 109, in test_patient_update_view
self.assertEqual(new_patient.first_name, 'Joe')
AssertionError: 'John' != 'Joe'
- John
+ Joe
----------------------------------------------------------------------
Это означает, что поля, указанные в data
, не обновляются. Я попробовал указать значения для всех полей в базе данных, как было предложено в этом посте , но это все равно не сработало. Представление обновления работает нормально, когда я тестирую его в браузере. Как я могу решить эту проблему?
Кроме того, response.status_code
возвращает 200 вместо 302 (происходит перенаправление на детальное представление), есть ли какие-либо предположения, почему это так? Спасибо.
Я наконец-то нашел решение. Установка всех значений для модели Patient
перед публикацией решила проблему. Ранее мне не удавалось задать значение для middle_name
, потому что я указал значение по умолчанию в модели базы данных. Вот обновленная функция test_patient_update_view
:
def test_patient_update_view(self):
data = {
'first_name':'Joe',
'middle_name': 'Jack',
'last_name':'Doe',
'sex' :'female',
'hospital_number':2,
'age':24,
'sex':'male',
'weight':'79 Kg',
}
new_patient = Patient.objects.create(
first_name='John',
last_name = 'doe',
hospital_number = 2,
age=24,
sex = 'male',
weight='79 Kg',
)
self.client.login(username=self.superuser.username, password='password')
response = self.client.post(reverse('patient_edit', kwargs={'pk': new_patient.id}), data)
self.assertEqual(response.status_code, 302)
new_patient.refresh_from_db()
self.assertEqual(new_patient.first_name, 'Joe')
self.assertEqual(new_patient.sex, 'female')
self.client.logout()
Теперь response.status_code
также возвращает 302.