我有这样的要求:
一旦用户注册(并且将处于等待状态,直到他确认了他的电子邮件地址),会话变量被设置为类似“FIRST_TIME_FREE_SESSION_EXPIRY_AGE_KEY”(抱歉,如果名称听起来令人困惑!)将被设置为a datetime对象将8小时添加到当前时间。
这应该如何影响用户,用户有8小时的时间来实际使用我们网站的所有功能,而无需确认他的signedup电子邮件地址。 8小时后,每个视图/页面都会显示一个大横幅,告诉用户确认。 (所有这些功能都是为每个视图使用一个“ensure_confirmed_user”装饰器实现的)。
我想使用django的unittest addon(TestCase类)测试相同的功能。我该怎么做?
更新:我是否需要手动更新提到的会话变量值(修改8小时到几秒)才能完成它?或者有更好的方法吗?
更新:这可能听起来很疯狂,但我想模拟未来的请求。
答案 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',
])
现在,您可以通过不同方式解决问题:
您可以使用以下活动设置模块:
from django.conf.project_template import settings
if settings.DEBUG:
...