我已经为客户构建了一个付费 CMS + 发票系统,我需要更加严格地进行测试。
我将所有数据保存在 Django ORM 中,并有一堆以不同时间间隔运行的 Celery 任务,以确保发送新发票和发票提醒,并在用户不支付发票时切断访问权限。
例如,我希望能够运行以下测试:
创建新用户并生成 X 天网站访问权限的发票
模拟 X + 1 天的过去,并运行我在 Celery 中设置的所有任务。
检查是否已向用户开具了另外 X 天的新发票。
到目前为止,我提出的 KISS 方法是在单独的机器上进行所有测试,并在操作系统级别实际操作日期/时间。所以测试脚本将:
将系统日期设置为第一天
创建新用户并生成 X 天访问权限的第一张发票
比系统日期提前 1 天。运行我所有的芹菜任务。重复直到 X + 1 天“过去”
检查是否已开具新发票
这有点笨拙,但我认为它可能有用。关于如何完成它还有其他想法吗?
您可以使用mock http://www.voidspace.org.uk/python/mock/更改用于获取时间的函数的返回值(datetime.datetime.now
例如)。
有多种方法可以做到这一点(请参阅模拟文档),但这是一种:
import unittest
import datetime
from mock import patch
class SomeTestCase(unittest.TestCase):
def setUp(self):
self.time = datetime.datetime(2012, 5, 18)
class fakedatetime(datetime.datetime):
@classmethod
def now(cls):
return self.time
patcher = patch('datetime.datetime', fakedatetime)
self.addCleanup(patcher.stop)
patcher.start()
def test_something(self):
self.assertEqual(datetime.datetime.now(), datetime.datetime(2012, 5, 18))
self.time = datetime.datetime(2012, 5, 20)
self.assertEqual(datetime.datetime.now(), datetime.datetime(2012, 5, 20))
因为我们不能直接替换datetime.datetime.now
,我们创建一个假的日期时间类,它以相同的方式执行所有操作,除了在调用 now 时返回一个常量值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)