2009-08-24 97 views
3

我有一个要求是这样的:如何单元测试会话超时在Django

只要用户signsup(并会处于等待状态,直到他确认他的电子邮件地址),会话变量设置的东西如“FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY”(抱歉,如果名称听起来令人困惑!)将被设置为将日期时间对象添加到当前时间8小时。

这应该如何影响用户,用户得到8小时的时间才能真正使用我们网站的所有功能,而无需确认他的签名电子邮件地址。 8小时后,每个视图/页面将显示一个大横幅,告诉用户确认。 (所有这些功能都是使用每个视图的一个“ensure_confirmed_user”装饰器来实现的)。

我想用django的unittest addon(TestCase类)测试相同的功能。我该怎么做?

更新:我是否需要手动更新提到的会话变量值(修改8小时到几秒)以完成它?或者有更好的方法吗?

更新:这可能听起来很疯狂,但我想模拟来自未来的请求。

+0

[freezegun(https://pypi.python.org/pypi/freezegun/)让你随意操纵时间的测试。由此产生的测试也很明确。 – 2016-05-02 09:50:31

回答

0

我可以想到几种可能性。在测试运行期间,覆盖FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY变量并将其设置为较小的时间限制。然后,您可以等到该时间限制结束并验证功能是否按预期工作。

或者更换自己datetime功能(假设你的功能依赖于datetime

您可以通过覆盖setup_teardown_test_environment方法实现这些。

3

一般来说,如果单元测试很困难,因为产品代码依赖于不会合作的外部资源,那么可以将这些资源抽象出来并用做你想做的虚拟代替。

在这种情况下,外部资源是时间。而不是使用datetime.now(),重构代码以接受外部时间函数。它可以默认为datetime.now。然后在你的单元测试中,你可以随着测试的进行改变时间。

这比将会话超时更改为几秒钟要好,因为即使这样,您也必须在测试中休眠几秒才能获得所需的效果。单元测试应该尽可能快地运行,以便它们能够更频繁地运行。

0

根据django是在生产环境还是在开发环境中运行,我的settings.py稍有不同。我有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: 
    ...