Я начал использовать среду тестирования Django, и все работало нормально, пока я не начал тестировать аутентифицированные страницы.
Для простоты скажем, что это тест:
class SimpleTest(TestCase):
def setUp(self):
user = User.objects.create_user('temporary', '[email protected]', 'temporary')
def test_secure_page(self):
c = Client()
print c.login(username='temporary', password='temporary')
response = c.get('/users/secure/', follow=True)
user = User.objects.get(username='temporary')
self.assertEqual(response.context['email'], '[email protected]')
После запуска этого теста он терпит неудачу, и я вижу, что возвращаемое значение печати login() возвращает True, но response.content перенаправляется на страницу входа в систему (если аутентификация при входе не выполняется, переориентатор аутентификации перенаправляется на страницу входа в систему). Я поставил точку прерывания в декораторе, которая выполняет аутентификацию:
def authenticate(user):
if user.is_authenticated():
return True
return False
и он действительно возвращает False. Строка 4 в test_secure_page() правильно извлекает пользователя.
Это функция просмотра:
@user_passes_test(authenticate, login_url='/users/login')
def secure(request):
user = request.user
return render_to_response('secure.html', {'email': user.email})
Конечно, если я попытаюсь войти в систему через приложение (вне теста), все будет хорошо.