2012-02-23 2 views
4

Я пытаюсь написать несколько тестов для приложения Django, над которым я работаю, но я еще не решил точно указать URL-адреса, которые я хочу использовать для каждого представления. Поэтому я использую именованные URL-адреса в тестах.Django тестирование URL-адресов с дополнительными параметрами GET

К примеру, у меня есть URL-адрес с именем приборной панели:

c = Client() 
resp = c.get(reverse('dashboard')) 

Эта точка зрения должна быть доступна только для зарегистрированных пользователей. Если текущий пользователь анонимен, он должен перенаправить их на страницу входа в систему, которая также является именованным URL. Однако, когда он делает это, он использует дополнительный параметр GET для отслеживания URL он просто пришел, что приводит к следующему:

/login?next=dashboard 

Когда я затем попытаться проверить переадресацию, он терпит неудачу из-за эти дополнительные параметры:

# It's expecting '/login' but gets '/login?next=dashboard' 
self.assertRedirects(resp, reverse('login')) 

Очевидно, что это работает, если я жестко закодировать их в тест:

self.assertRedirects(resp, '/login?next=dashboard') 

Но тогда, если я когда-нибудь решите изменить URL для моего зрения приборной панели , Я должен будет обновить каждый тест, который его использует.

Есть ли что-то, что я могу сделать, чтобы упростить обработку этих дополнительных параметров?

Любые советы, оцененные.

Спасибо.

ответ

4

Как вы можете видеть, обратный (...) возвращает строку, вы можете использовать как:

self.assertRedirects(resp, '%s?next=dashboard' % reverse('login')) 
+1

Почти было, но вы пропустили всю точку вопроса в ФП в. Он не беспокоится о части «входа» URL-адреса, но параметр 'next' GET. URL-адрес «приборной панели» может измениться в будущем, поэтому OP не хочет жестко кодировать его в тестах. @Dan: вы можете в принципе придерживаться того же подхода здесь, но замените «приборную панель» на «% s» и передайте 'reverse ('dashboard')' для параметра string. –

+0

Проблема в том, что параметры GET не могут быть записаны в urls.py напрямую, поэтому @Dan вы можете использовать LOGIN_REDIRECT_URL = '/ dashboard /' в settings.py для перенаправления нужного URL-адреса после входа в систему. И если вы используете login_required decorator для функции views, анонимный будет перенаправлен на этот URL. – greg

+1

Вам не нужно ничего делать в urls.py. Параметр 'next' буквально означает« перейти к следующему URL-адресу после ». Ему просто нужно утверждать, что URL-адрес включает в себя «? Next =% s»% reverse ('dashboard') '. Затем, независимо от того, какой URL-адрес «панель управления» разрешает, он будет соответствовать. –

Смежные вопросы