如何在Django中单元测试会话超时

时间:2009-08-24 07:35:04

标签: django session testing testcase

我有这样的要求:

一旦用户注册(并且将处于等待状态,直到他确认了他的电子邮件地址),会话变量被设置为类似“FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY”(抱歉,如果名称听起来令人困惑!)将被设置为a datetime对象将8小时添加到当前时间。

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

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

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

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

3 个答案:

答案 0 :(得分:3)

通常情况下,如果单元测试很困难,因为产品代码依赖于不合作的外部资源,您可以抽象出那些资源,并用符合您需要的虚拟替换它们。

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

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

答案 1 :(得分:0)

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

替换您自己的datetime功能(假设您的功能依赖于datetime

您可以通过覆盖setup_teardown_test_environment方法来完成这些操作。

答案 2 :(得分:0)

我的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在生产服务器上省略单元测试,因为测试可能需要很长时间。
  3. 您可以使用以下活动设置模块:

    from django.conf.project_template import settings
    
    if settings.DEBUG:
        ...