4

我有这样的要求:

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

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

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

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

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

4

3 回答 3

3

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

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

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

于 2009-08-24T11:27:16.980 回答
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 省略单元测试,因为无论如何测试可能会花费太长时间。

您可以像这样使用活动设置模块:

from django.conf.project_template import settings

if settings.DEBUG:
    ...
于 2009-08-24T20:23:16.193 回答
0

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

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

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

于 2009-08-24T08:06:50.083 回答