Django 1.9测试timezone.now()

时间:2016-07-08 15:16:22

标签: django unit-testing python-3.x django-models django-timezone

TL; DR :仅从<sqf:stringReplace>获取当前日期和当前小时和当前分钟,而不是秒和毫秒。

Django版本:1.9 Python版本:3.5.1

在测试我的应用程序的模型时,我遇到了一个奇怪的(对我而言)错误。

我有这个型号:

timezone.now()

和本单元测试:

import datetime

from django.core.urlresolvers   import reverse
from django.utils               import timezone
from django.db                  import models

class Muayene(models.Model):
    ...
    muayene_tarihi = models.DateField(
        default = timezone.now
    )
    ...

测试结果:

import datetime

from django.test                    import TestCase
from django.utils                   import timezone

from hasta.models                   import Hasta
from muayene.models                 import Muayene

class MuayeneModelTest(TestCase):

    fixtures = ['muayene_testdata', 'hasta_testdata']

    def setUp(self):
        Hasta.objects.create(ad="foo",soyad="bar",tc_kimlik_no="1234")
    def test_default_muayene_tarihi(self):
        hasta = Hasta.objects.get(ad="foo")
        muayene = Muayene.objects.create(hasta=hasta)
        self.assertEqual(muayene.muayene_tarihi, timezone.now())

正如您所注意到的,问题是从FAIL: test_default_muayene_tarihi (muayene.tests.test_models.MuayeneModelTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/egegunes/Dropbox/Programs/hastatakip/muayene/tests/test_models.py", line 21, in test_default_muayene_tarihi self.assertEqual(muayene.muayene_tarihi, timezone.now()) AssertionError: datetime.datetime(2016, 7, 8, 14, 38, 54, 780069, tzinfo=<UTC>) != datetime.datetime(2016, 7, 8, 14, 38, 54, 780539, tzinfo=<UTC>) 调用的timezone.now和调用models.py timezone.now()的{​​{1}}的输出之间存在差异。

我找到了regex syntax的解决方法。但存储精确的毫秒或秒不是我真正的意图。我只想要当前的日期和时间(小时和分钟)。此外,我不想设置test_models.py或类似的东西,因为django会发出有关仅使用default = datetime.date.today()的警告。

所以我的问题是,我如何只使用timezone.now获取当前日期,时间和分钟?

1 个答案:

答案 0 :(得分:3)

由于你可以将任何可调用语传递给default,所以只需编写自己的函数即可。例如:

from django.db import models
from django.utils import timezone

def strip_seconds(dt):
    return dt.replace(second=0, microsecond=0)

def now():
    return strip_seconds(timezone.now())

class Muayene(models.Model):
    # Note that this should be a DateTimeField, not a DateField
    muayene_tarihi = models.DateTimeField(default=now)

因此,在测试中,您可以将now()版本的返回值与数据库中的内容进行比较(或在任意日期时间调用strip_seconds())。

请注意,比较相等性仍然不是完全可靠的,因为如果两个调用恰好跨越一个分钟边界,则可能会导致测试失败。