Как установить cookie в тестовом примере django? - PullRequest
1 голос
/ 30 мая 2011

Я изо всех сил пытаюсь понять это, сеансы работают, когда я запускаю свое приложение нормально, но я не могу понять, как установить данные в сеансе в моем тестовом примере.

Документы говорят вВ тестовом примере вы должны сохранить сеанс, чтобы применить изменения перед выполнением запроса.https://docs.djangoproject.com/en/1.2/topics/testing/#persistent-state

например,

from django.test import TestCase

class TestLogin(TestCase):

    def test_processuser(self):
        redirect = '/processuser/'
        session = self.client.session
        session["id"] = '1234'
        session.save()
        response = self.client.get(redirect)

Однако объект сеанса, возвращаемый из self.client.session, является просто обычным python dict?

Копание в коде клиента.вызов сеанса таков:

def _session(self):
    """
    Obtains the current session variables.
    """
    if 'django.contrib.sessions' in settings.INSTALLED_APPS:
        engine = import_module(settings.SESSION_ENGINE)
        cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)
        if cookie:
            return engine.SessionStore(cookie.value)
    return {}
session = property(_session)

cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None) возвращает None, поэтому он просто возвращает dict вместо хранилища сеансов.

Похоже, мне нужно еще немного подготовиться в тестовом клиенте, прежде чем я сохраню сеанс?Не очень много опыта в этом любая помощь будет оценена.

Django 1.2.5 Python 2.6.5

Приветствия,

Asim.

Ответы [ 3 ]

7 голосов
/ 04 июля 2014

Добавление этого для людей, которым действительно нужно нужно установить cookie, например, потому что им нужно сделать что-то, что не покрыто механизмом аутентификации Django ...

Вы можетеНе устанавливайте куки непосредственно на TestClient объекты, но если вы используете класс RequestFactory, вы можете сделать это.Поэтому вместо (скажем):

response = Client().post('/foo')

вы делаете:

request = RequestFactory().post('/foo')
request.COOKIES['blah'] = 'hello'
response = foo_view(request)

, где foo_view - это представление, соответствующее пути '/ foo', т.е. представление, которое выищу тест.

HTH кто-нибудь.

1 голос
/ 30 мая 2011

Самое простое - войти в систему под другим именем, чтобы тестовый клиент установил для вас cookie.

self.client.login(username,password)

должен сделать. Подробнее см. документацию .

0 голосов
/ 22 января 2016

Для других людей, которые сталкиваются с этой проблемой, имейте в виду, что функция Client.logout() удалит ваши куки.Например:

response = self.client.post(self.url, self.data)
print response.client.cookies.items()  # Displays the cookie you just set

self.client.logout()

response = self.client.post(reverse('loginpage'), {'username': 'username', 'password': 'password'}, follow=True)
print response.client.cookies.items()  # Does not display the cookie you set before since it got destroyed by logout()

Чтобы убедиться, что ваши куки-файлы остаются живыми во время тестирования, позвоните на страницу выхода из системы вместо использования функции Client.logout(), например:

response = self.client.post(self.url, self.data)
print response.client.cookies.items()  # Displays the cookie you just set

self.client.get(reverse('logoutpage'))

response = self.client.post(reverse('loginpage'), {'username': 'username', 'password': 'password'}, follow=True)
print response.client.cookies.items()  # Does display the cookie you set before since it did not get destroyed by client.logout()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...