Проблема с тестированием UpdateView в Django
У меня есть UpdateView, который позволяет редактировать объекты модели Scooter. После успешной обработки формы (через POST-запрос) представление должно перенаправить пользователя на страницу подробностей редактируемого скутера (с кодом состояния 302). Однако в моем тесте я вижу, что ответ после POST-запроса возвращает код состояния 200, а response.context содержит данные объекта, как будто форма была переоткрыта, а не произошел редирект.
Почему UpdateView возвращает код состояния 200 после POST-запроса, хотя метод get_success_url настроен правильно? Является ли использование response.context после POST уместным в таком тесте? Следует ли вместо этого использовать refresh_from_db для объекта в базе данных? Есть ли лучший способ протестировать поведение UpdateView в Django, чтобы избежать потенциальных несоответствий с поведением представления после POST-запроса?
(они находятся в разных файлах, конечно, мне просто нужно было вставить их сюда)
@pytest.mark.django_db
def test_scooter_detail_edit_data(client, superuser_user, available_scooter):
url = reverse('scooter-update', kwargs={'scooter_id': available_scooter.id})
client.force_login(superuser_user)
response = client.get(url)
assert response.status_code == 200
assert response.context['scooter'].available == True
assert response.context['scooter'].daily_price == 100
response = client.post(url, data={
'available': False,
'daily_price': 200,
})
assert response.status_code == 200
assert response.context['scooter'].available == False
assert response.context['scooter'].daily_price == 200
class ScooterUpdateView(UpdateView):
model = Scooter
template_name = 'scooters/scooter_edit.html'
pk_url_kwarg = 'scooter_id'
fields = [
'available',
'image',
'daily_price',
'weekly_price',
'monthly_price',
'deposit_amount',
]
def get_queryset(self):
if self.request.user.is_superuser:
return Scooter.objects.all()
raise Http404
def get_success_url(self):
return reverse_lazy('scooter-detail', kwargs={'scooter_id': self.object.pk})
@fixture
def available_scooter():
scooter = Scooter.objects.create(
brand="Yamaha",
scooter_model="XMax 300",
capacity=300,
year=2022,
registration_number="KR12345",
available=True,
image=None,
daily_price=100,
weekly_price=600,
monthly_price=2000,
deposit_amount=500,
)
return scooter
tests/tests.py::test_scooter_detail_edit_data PASSED
Почему UpdateView возвращает код состояния 200 после POST-запроса, хотя метод get_success_url настроен правильно?
Потому что POST-запрос не является успешным. Действительно, если данные, которые вы отправляете в форму, недействительны, и форма, таким образом, отклоняет их, UpdateView
отобразит шаблон с формой, а также форму, показывающую ошибки.
Здесь похоже, что данные отсутствуют, некоторые поля могут быть обязательными, и поэтому форма, вероятно, отклоняет данные.