我正在尝试为执行大量日期时间操作的 django 应用程序编写单元测试。我已经为我的测试安装了猴子补丁 django 的模拟。timezone.now
虽然我能够在timezone.now
正常调用它时成功模拟(实际上是timezone.now()
在我的代码中调用,但我无法为使用DateTimeField
with创建的模型模拟它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
我的选择(可能由 mocked 生成timezone.now
)...很好奇是否有一种方法可以避免这种情况。