Я начал использовать фреймворк тестирования Django, и все работало хорошо, пока я не начал тестировать аутентифицированные страницы.
Для простоты скажем, что это тест:
class SimpleTest(TestCase):
def setUp(self):
user = User.objects.create_user('temporary', 'temporary@gmail.com', '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'], 'temporary@gmail.com')
После того, как я запустил этот тест, он не работает, и я вижу, что при печати возвращаемого значения 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})
Конечно, если я попытаюсь войти через приложение (вне теста), все работает нормально.