【发布时间】:2013-09-26 07:40:40
【问题描述】:
我正在尝试为执行大量日期时间操作的 django 应用程序编写单元测试。我已经为我的测试安装了mock 到猴子补丁 django 的timezone.now。
虽然我能够在正常调用timezone.now 时成功模拟它(实际上在我的代码中调用timezone.now(),但我无法模拟使用DateTimeField 和default=timezone.now 创建的模型。
我有一个 User 模型,其中包含以下内容:
from django.utils import timezone
...
timestamp = models.DateTimeField(default=timezone.now)
modified = models.DateTimeField(default=timezone.now)
...
def save(self, *args, **kwargs):
if kwargs.pop('modified', True):
self.modified = timezone.now()
super(User, self).save(*args, **kwargs)
我的单元测试如下所示:
from django.utils import timezone
def test_created(self):
dt = datetime(2010, 1, 1, tzinfo=timezone.utc)
with patch.object(timezone, 'now', return_value=dt):
user = User.objects.create(username='test')
self.assertEquals(user.modified, dt)
self.assertEquals(user.timestamp, dt)
assertEquals(user.modified, dt) 通过,但 assertEquals(user.timestamp, dt) 不通过。
我如何模拟 timezone.now 以便即使在我的模型中的 default=timezone.now 也会创建模拟时间?
编辑
我知道我可以更改我的单元测试以通过我选择的timestamp(可能由模拟的timezone.now 生成)...很好奇是否有办法避免这种情况。
【问题讨论】:
-
您能否提供
User模型的完整相关列表?了解默认值绑定发生在什么时候非常重要。
标签: python django unit-testing mocking python-mock