Django model created time test issue - datetime

Reading time ~1 minute


django에서 특정 model에 생성될 때의 시간을 기록하기 위한 created time 필드를 추가하고 단위테스트를 하는 과정에서 발생하는 문제에 대해서 다룬다.


Unittest

데이터가 생성 될 때의 시간이 잘 저장되는지 테스트하기 위하여 Comment의 객체를 하나 생성하여 DB에 저장하고 직후의 시간 값을 저장해서 그 둘의 차이가 1초보다 작은지를 테스트한다.

from datetime import datetime, timedelta

def test_saving_create_time(self):
    comment_ = Comment()
    [...]
    comment_.save()
    time_after_create = datetime.now()

    self.assertGreater(timedelta(minutes=1), time_after_create - comment_.create_time)


models.py

model에 시간을 저장하기 위한 필드를 추가한다. auto_now_add=True를 추가하면 데이터가 생성되어 처음 저장 될 때 동작한다. (auto_now=True는 데이터가 수정될 때마다 갱신된다.)

class Comment(models.Model):
    [...]
    create_time = models.DateTimeField(auto_now_add=True)

모델이 변경되었으니 $ python manage.py makemigrations을 실행시켜 준다.


Error

테스트를 돌려보면 아래와 같은 에러 메세지가 뜬다.

TypeError: can't subtract offset-naive and offset-aware datetimes

create_time의 dafault 값은 django.utils.timezone.now 으로 time zone이 utc로 지정된 것이고, 테스트 코드에서 datetime.now()는 time zone이 지정되지 않은 것으로 두 값의 type이 달라서 발생하는 에러이다.


Resolve

def test_saving_create_time(self):
    comment_ = Comment()
    [...]
    comment_.save()
    time_after_create = datetime.now(timezone.utc)

    self.assertGreater(timedelta(minutes=1), time_after_create - comment_.create_time)

테스트 코드의 현재 시간을 가져오는 부분에 timezone을 utc로 설정해주면 문제를 해결할 수 있다.

좋은 커밋 메세지 작성하기

커밋 메세지를 작성하다 보면 어떻게 작성하는 것이 좋은 커밋 메세지인가를 고민하고 찾아볼 때가 많이 있다. 좋은 커밋 메세지를 작성하는 방법에 대해서 이번 포스팅에서 정리 해보려고 한다.필요성협동 프로젝트에서 작성된 코드를 리뷰하는 것은 필수...… Continue reading