2009-08-24 2 views
3

У меня есть требование что-то вроде этого:Как UnitTest тайм-аут сеанса в Django

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

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

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

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

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

+0

[freezegun] (https://pypi.python.org/pypi/freezegun/) давайте вы управлять временем по собственному желанию в тестах. Получившийся результат будет также явным. –

ответ

0

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

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

Вы можете сделать это путем переопределения setup_ и teardown_test_environment методы.

3

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

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

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

0

Мои настройки.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: 
    ... 
Смежные вопросы