0

TL : 초와 밀리 초가 아닌 timezone.now()에서 현재 날짜와 현재 시간 및 현재 시간 만 가져옵니다.Django 1.9 테스트 timezone.now()

장고 버전 : 1.9 파이썬 버전 : 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>) 

당신이 알 수 있듯이, 문제는 출력의 차이입니다

나는이 모델이 timezone.nowmodels.pytimezone.now()에서 호출 양식 test_models.py이라고합니다.

해결 방법은 this question입니다. 그러나 정확한 밀리 세컨드 또는 초를 저장하는 것이 나의 진정한 의도는 아닙니다. 현재 날짜와 시간 (시와 분) 만 원합니다. 또한 default = datetime.date.today() 또는 이와 유사한 것을 설정하고 싶지는 않습니다. 장고는 단지 timezone.now을 사용하는 것에 대한 경고를하기 때문입니다.

그럼 내 질문은 timezone.now()으로 현재 날짜, 시간 및 분만 가져올 수 있습니까?

답변

2

임의의 호출 가능 번호를 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() 전화).

평등에 대한 비교는 여전히 두 가지 호출이 1 분 경계를 넘는다면 테스트 실패를 가져올 수 있기 때문에 전체적으로 강력하지는 않습니다.

+0

그렇다면이 함수와'default = now'를 사용하여 기본값을'timezone.now'로 설정하는 것에 대한 권장 사항을 따르고 있습니까? – egegunes

+0

@gegeunes : 파이썬 대신 Django의 버전 인'now()'를 사용하는 것이 좋습니다. 왜냐하면 시간대 설정을 고려하기 때문입니다. 내가 게시 한 코드는 그렇게합니다. 호출 가능한'default'가 가리켜 야하는 것에 대한 권고는 없습니다. 예를 들어, [here] (https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.DateField)를 참조하십시오. "다른 것을 필요로한다면, 단순히 자신의 호출 가능한 기본값을 사용합니다. " –

+0

Kevin, 고맙습니다. – egegunes

관련 문제