Почему django.test.client.Client не позволяет мне войти в систему - PullRequest
4 голосов
/ 21 мая 2010

Я использую django.test.client.Client, чтобы проверить, появляется ли какой-либо текст, когда пользователь вошел в систему. Однако, я, кажется, объект Client не держит меня в системе.

Этот тест проходит, если выполняется вручную с Firefox, но не выполняется с объектом Client.

class Test(TestCase):
    def test_view(self):
        user.set_password(password)
        user.save()

        client = self.client
        # I thought a more manual way would work, but no luck
        # client.post('/login', {'username':user.username, 'password':password})
        login_successful = client.login(username=user.username, password=password)
        # this assert passes  
        self.assertTrue(login_successful)

        response = client.get("/path", follow=True)
        #whether follow=True or not doesn't seem to work

        self.assertContains(response, "needle" )

Когда я печатаю ответ, он возвращает форму входа, которая скрыта:

{% if not request.user.is_authenticated %}
    ... form ...
{% endif %}

Это подтверждается при запуске ipython manage.py shell.

Кажется, проблема в том, что объект Client не поддерживает аутентификацию сеанса.

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Только что случилось со мной при повторном тестировании приложения, которое работало и забыто в течение нескольких месяцев.

Решение (кроме обновления до Django 1.2): Patch # 11821 . Короче говоря, в Python 2.6.5 есть некоторое исправление в модуле Cookie, вызывающее ошибку в крайнем случае в тестовом клиенте.

0 голосов
/ 21 мая 2010

FWIW, обновление до Django 1.2 (раньше я работал под управлением 1.1.1) исправило это. Я понятия не имею, что там сломалось, учитывая, что когда я последний раз запускал этот тестовый пакет около 2 недель назад, он работал отлично.

0 голосов
/ 21 мая 2010

Я использую RequestContext, чтобы войти в систему в контексте шаблона.

from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from django.template import RequestContext

@login_required
def index(request):
   return render_to_response('page.html',
                             {},
                             context_instance=RequestContext(request))

и в шаблоне

{% if user.is_authenticated %} ... {{ user.username }} .. {% endif %}

Это работает как ожидалось (я не попадаю на эту страницу без входа в систему, и когда я туда попадаю, имя пользователя присутствует в response.content) при прохождении через тестовый клиент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...