Как протестировать перенаправление, если form.is_valid()

#django #django-testing

#django #django-тестирование

Вопрос:

Я создал представление, кто публикует данные и перенаправляет на контакт / успех. Моя проблема в том, как протестировать перенаправление с помощью assertRedirects?

Мой Views.py:

 def emailView(request):
    form = ContactForm(request.POST)
    if form.is_valid():
        gender = form.cleaned_data['gender']
        first_name = form.cleaned_data['first_name']
        last_name = form.cleaned_data['last_name']
        gender = request.POST['gender']
        first_name = request.POST['first_name']
        last_name = request.POST['last_name']
        context = {
             'form': form,
        } 
    return redirect('success_contact')
  

‘success_contact’ перенаправляет на URL ‘contact / success’. В моем tests.py Я пытался добиться этого таким образом:

  form_data = {'gender': '1, 'first_name': 'Luke',
              'last_name': 'Skywalker'}
 form = ContactForm(form_data)
 response = self.client.post('/contact', form_data)
 self.assertRedirects(response, '/contact/success/',
                      status_code=302, target_status_code=200)
  

К сожалению, я только что получил эту ошибку AssertationError:

  Traceback (most recent call last):
 File 
 "/Users/user/Django/contactproj/contact/tests/test_views.py", line 126, in test_view_form_valid
target_status_code=200)
 File "/Users/user/anaconda3/envs/contactproj/lib/python3.6/site-packages/django/test/testcases.py", line 283, in assertRedirects
% (response.status_code, status_code)

AssertionError: 301 != 302 : Response didn't redirect as expected: Response code was 301 (expected 302)
  

Ответ №1:

Вы отправляете сообщение на неправильный URL-адрес в своем тесте, он должен быть /contact/ с завершающей косой чертой. Еще лучше, используйте reverse() функцию для поиска URL.

Комментарии:

1. Спасибо большое! Исправлено с помощью обратного метода. Всегда ли обратное решение является лучшим?

2. Да, в значительной степени, это позволяет избежать жесткого кодирования.