Как проверить время ожидания сеанса в Джанго - PullRequest
3 голосов
/ 24 августа 2009

У меня есть требование примерно так:

Как только пользователь зарегистрируется (и будет находиться в состоянии ожидания, пока не подтвердит свой адрес электронной почты), переменная сеанса будет установлена ​​примерно так: «FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY» (извините, если имя звучит запутанно!), Которое будет установлено в объект datetime, добавляющий 8 часов к текущему времени.

Как это должно повлиять на пользователя, пользователь получает 8 часов времени, чтобы фактически использовать все функции нашего сайта, не подтверждая адрес своей подписанной электронной почты. Через 8 часов на каждом просмотре / странице будет отображаться большой баннер с указанием подтверждения. (Все эти функциональные возможности достигаются с помощью единого декоратора «sure_confirmed_user» для каждого представления).

Я хочу проверить ту же функциональность, используя аддон юнит-теста django (класс TestCase). Как мне это сделать?

Обновление: нужно ли вручную обновлять упомянутое значение переменной сеанса (изменено 8 часов до нескольких секунд), чтобы это было сделано? Или есть какой-нибудь лучший способ?

Обновление: это может звучать безумно, но я хочу смоделировать запрос из будущего.

Ответы [ 3 ]

3 голосов
/ 24 августа 2009

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

В этом случае внешним ресурсом является время. Вместо использования datetime.now (), рефакторинг кода для принятия внешней функции времени. По умолчанию это может быть datetime.now. Затем в своих модульных тестах вы можете изменить время по ходу теста.

Это лучше, чем изменение времени ожидания сеанса на несколько секунд, потому что даже в этом случае вам придется поспать несколько секунд в тесте, чтобы получить желаемый эффект. Модульные тесты должны выполняться так быстро, как вы можете, чтобы они выполнялись чаще.

0 голосов
/ 25 августа 2009

Мой файл settings.py немного отличается в зависимости от того, запущен ли django в производственной среде или в среде разработки. У меня есть 2 модуля настроек: settings.py и settings_dev.py. Разрабатываемая версия выглядит следующим образом:

from settings import *

DEBUG = True

INSTALLED_APPS = tuple(list(INSTALLED_APPS) + [
            'dev_app',
            ])

Теперь вы можете решить свою проблему по-разному:

  1. добавить переменную с разными значениями в оба модуля настроек;
  2. Если вы устанавливаете переменную, выберите одно из двух значений в соответствии со значением параметра DEBUG. Вы также можете использовать DEBUG, чтобы пропустить модульный тест на производственном сервере, потому что тест все равно может занять слишком много времени.

Вы можете использовать модуль активных настроек следующим образом:

from django.conf.project_template import settings

if settings.DEBUG:
    ...
0 голосов
/ 24 августа 2009

Я могу придумать пару возможностей. Во время выполнения теста переопределите переменную FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY и установите для нее меньшее ограничение по времени. Затем вы можете подождать, пока этот срок не закончится, и проверить, работает ли эта функция должным образом.

Альтернативно замените ваши собственные datetime функции (при условии, что ваша функция зависит от datetime)

Вы можете сделать это, переопределив setup_ и teardown_test_environment методы.

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