栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用基于日期/时间的对象进行Django单元测试

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用基于日期/时间的对象进行Django单元测试

编辑
:由于我的答案是此处接受的答案,因此我正在对其进行更新,以使所有人都知道在此同时创建了更好的方法,这是freezegun库:https
://pypi.python.org/pypi/freezegun 。当我想影响测试时间时,会在所有项目中使用此功能。看看它。

原始答案:

更换内部零件总是很危险的,因为它可能会带来讨厌的副作用。因此,您真正想要的是让猴子修补尽可能地局部。

我们使用了Michael Foord出色的模拟库:http
://www.voidspace.org.uk/python/mock/
,该库具有

@patch
装饰器,该装饰器修补某些功能,但是Monkey修补器仅位于测试功能的范围内,并且一切功能超出范围后会自动恢复。

唯一的问题是内部

datetime
模块是用C实现的,因此默认情况下您将无法进行猴子补丁。我们通过制作 可以 模拟的自己的简单实现来解决此问题。

总体解决方案是这样的(示例是在Django项目中使用的验证器函数,用于验证日期在将来)。请注意,我是从一个项目中拿出来的,但是拿出了一些不重要的东西,因此在复制粘贴时,事情可能实际上不起作用,但是我希望您明白了,

首先,我们

datetime.date.today
在一个名为的文件中定义自己的非常简单的实现
utils/date.py

import datetimedef today():    return datetime.date.today()

然后,我们在以下代码中为此验证器创建单元测试

tests.py

import datetimeimport mockfrom unittest2 import TestCasefrom django.core.exceptions import ValidationErrorfrom .. import validatorsclass ValidationTests(TestCase):    @mock.patch('utils.date.today')    def test_validate_future_date(self, today_mock):        # Pin python's today to returning the same date        # always so we can actually keep on unit testing in the future :)        today_mock.return_value = datetime.date(2010, 1, 1)        # A future date should work        validators.validate_future_date(datetime.date(2010, 1, 2))        # The mocked today's date should fail        with self.assertRaises(ValidationError) as e: validators.validate_future_date(datetime.date(2010, 1, 1))        self.assertEquals([u'Date should be in the future.'], e.exception.messages)        # Date in the past should also fail        with self.assertRaises(ValidationError) as e: validators.validate_future_date(datetime.date(2009, 12, 31))        self.assertEquals([u'Date should be in the future.'], e.exception.messages)

最终的实现如下所示:

from django.utils.translation import ugettext_lazy as _from django.core.exceptions import ValidationErrorfrom utils import datedef validate_future_date(value):    if value <= date.today():        raise ValidationError(_('Date should be in the future.'))

希望这可以帮助



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/668444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号