代码之家  ›  专栏  ›  技术社区  ›  Nanda Kishore

如何在django中统一测试会话超时

  •  3
  • Nanda Kishore  · 技术社区  · 15 年前

    我有这样的要求:

    一旦用户签名(并且在确认其电子邮件地址之前将处于等待状态),就会设置一个session变量,例如“first-time-free-session-expiry-age-key”(如果名称听起来很混乱,很抱歉!)它将被设置为一个日期时间对象,在当前时间上添加8小时。

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

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

    更新:是否需要手动更新提到的会话变量值(将8hrs修改为几秒)以便完成?或者有更好的办法吗?

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

    3 回复  |  直到 11 年前
        1
  •  3
  •   Ned Batchelder    15 年前

    通常,如果单元测试很困难,因为产品代码依赖于不合作的外部资源,那么您可以将这些资源抽象出来,并用做您想要的事情的傻瓜来替换它们。

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

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

        2
  •  0
  •   Manoj Govindan    15 年前

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

    交替替换你自己的 datetime 函数(假设您的功能依赖于 日期时间 )

    你可以通过覆盖 setup_ teardown_test_environment 方法。

        3
  •  0
  •   pvoosten    15 年前

    my settings.py略有不同,这取决于django是在生产环境中运行还是在开发环境中运行。我有两个设置模块:settings.py和settings_dev.py。开发版本如下:

    from settings import *
    
    DEBUG = True
    
    INSTALLED_APPS = tuple(list(INSTALLED_APPS) + [
                'dev_app',
                ])
    

    现在你可以用不同的方式解决问题:

    1. 将不同值的变量添加到两个设置模块中;
    2. 在设置变量的位置,根据调试设置的值在两个值之间进行选择。您还可以使用debug在生产服务器上省略单元测试,因为测试可能会花费太长时间。

    您可以使用活动设置模块,如下所示:

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