Django 1.9 测试 timezone.now()
Django 1.9 testing timezone.now()
TL;DR:仅从 timezone.now()
获取当前日期、当前小时和当前分钟,而不是秒和毫秒。
Django 版本:1.9
Python版本:3.5.1
在测试我的应用模型时,我遇到了一个(对我来说)奇怪的错误。
我有这个型号:
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>)
正如您所注意到的,问题在于从 models.py
调用的 timezone.now
和调用表单 test_models.py
.
的 timezone.now()
的输出之间的差异
我找到了 this question 解决方法。但是存储精确的毫秒或秒并不是我的真正意图。我只想要当前日期和时间(小时和分钟)。我也不想设置 default = datetime.date.today()
或类似的东西,因为 django 给出了关于仅使用 timezone.now
的警告。
所以我的问题是,如何使用 timezone.now()
获取唯一且唯一的当前日期、小时和分钟?
由于您可以将任何可调用对象传递给 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()
版本的 return 值与数据库中的值进行比较(或在任意日期时间调用 strip_seconds()
)。
请注意,比较是否相等仍然不完全可靠,因为如果两次调用恰好跨越一分钟边界,则可能会导致测试失败。
TL;DR:仅从 timezone.now()
获取当前日期、当前小时和当前分钟,而不是秒和毫秒。
Django 版本:1.9 Python版本:3.5.1
在测试我的应用模型时,我遇到了一个(对我来说)奇怪的错误。
我有这个型号:
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>)
正如您所注意到的,问题在于从 models.py
调用的 timezone.now
和调用表单 test_models.py
.
timezone.now()
的输出之间的差异
我找到了 this question 解决方法。但是存储精确的毫秒或秒并不是我的真正意图。我只想要当前日期和时间(小时和分钟)。我也不想设置 default = datetime.date.today()
或类似的东西,因为 django 给出了关于仅使用 timezone.now
的警告。
所以我的问题是,如何使用 timezone.now()
获取唯一且唯一的当前日期、小时和分钟?
由于您可以将任何可调用对象传递给 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()
版本的 return 值与数据库中的值进行比较(或在任意日期时间调用 strip_seconds()
)。
请注意,比较是否相等仍然不完全可靠,因为如果两次调用恰好跨越一分钟边界,则可能会导致测试失败。