【问题标题】:How to unittest Session timeout in Django如何在 Django 中对会话超时进行单元测试
【发布时间】:2010-11-22 04:46:01
【问题描述】:

我有这样的要求:

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

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

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

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

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

【问题讨论】:

  • freezegun 让您在测试中随意操纵时间。结果测试也将非常明确。

标签: django session testing testcase


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    通常,如果由于产品代码依赖于不合作的外部资源而导致单元测试很困难,您可以抽象出这些资源并用可以做您想做的事情的假人替换它们。

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

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

    【讨论】:

      【解决方案3】:

      根据 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:
          ...
      

      【讨论】:

        猜你喜欢
        • 2011-02-02
        • 2018-02-11
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 2013-09-29
        • 2013-01-20
        相关资源
        最近更新 更多