Django 단위 테스트에서 datetime을 패치하는 가장 좋은 방법

방해 기

datetime.datetime코드 전체에서 datetime을 패치하기 위해 홈 브루 모의를 사용하고 있지만 (맨 아래 참조) 다른 사람들은 작동 방식을 이해하는 데 문제가 발생하고 예기치 않은 문제가 발생하는 것 같습니다. 다음 테스트를 고려했습니다.

@patch("datetime.datetime", FakeDatetime)
def my_test(self):
  FakeDatetime.now_value = datetime(2014, 04, 02, 13, 0, 0)

  u = User.objects.get(x=y)
  u.last_login = datetime(2014, 04, 01, 14, 0, 0)
  u.save()

  u2 = User.objects.get(x=y)
  # Checks if datetime.datetime.now() - u2.last_login < 24 hours
  self.assertTrue(u2.logged_in_in_last_24_hours())

이제 Django DatetimeField가 날짜를 SQL로 직렬화하는 방법을 살펴보면 :

def to_python(self, value):
  if value is None:
    return value
  if isinstance(value, datetime.datetime):
    return value
  if isinstance(value, datetime.date):
    value = datetime.datetime(value.year, value.month, value.day)

출처

이 부분은 u.save()테스트에서 호출 할 때 실행됩니다 . Django 코드 값 value( u.last_login) 의이 지점 datetime.datetime은 패치되지 않은 datetime 버전을 사용하여 테스트에 값을 할당했기 때문에 유형 입니다 (가져 오기는 모듈 수준이고 패치는 메서드 수준이기 때문입니다).

이제 Django 코드에서 datetime.datetime패치가 적용되었습니다.

isinstance(value, datetime.datetime)

다음과 같습니다.

isinstance(datetime.datetime(2014, 04, 01, 14, 0, 0), FakeDatetime)

False이지만 :

isinstance(datetime.datetime(2014, 04, 01, 14, 0, 0), datetime.date)

진정한 따라서되는 datetime.datetime개체는 변환됩니다 datetime.date, 당신은 검색 할 때 u2.last_login는 SQL에서 값이 실제로 datetime(2014, 04, 01, 0, 0, 0)하지datetime(2014, 04, 01, 14, 0, 0)

따라서 테스트가 실패합니다.

이 문제를 해결하는 방법은 다음을 교체하는 것입니다.

u.date_joined = datetime(2014, 04, 01, 14, 0, 0)

와:

u.date_joined = FakeDatetime(2014, 04, 01, 14, 0, 0)

그러나 이것은 실수하기 쉽고 테스트를 사용하거나 작성하는 사람들을 혼란스럽게하는 경향이 있습니다.

특히 실제 now이 필요한 경우 수행 datetime_to_fakedatetime(datetime.datetime.now())하거나 호출 FakeDatetime.now()해야하지만 이전 테스트에서 FakeDatetime.now_value.

나는 이것을 더 직관적으로 만드는 방법을 찾고 있지만 동시에 datetime.datetime특정 하위 모듈 객체 를 패치하는 것을 피하고 코드 전체에 패치를 적용합니다.

홈브류 모의 코드 :

from datetime import datetime

class FakeDatetime(datetime):
  now_value = None

  def __init__(self, *args, **kwargs):
    return super(FakeDatetime, self).__init__()

  @classmethod
  def now(cls):
    if cls.now_value:
      result = cls.now_value
    else:
      result = datetime.now()
    return datetime_to_fakedatetime(result)

  @classmethod
  def utcnow(cls):
    if cls.now_value:
      result = cls.now_value
    else:
      result = datetime.utcnow()
    return datetime_to_fakedatetime(result)

  # http://stackoverflow.com/questions/20288439/how-to-mock-the-operator-in-python-specifically-datetime-date-datetime-ti
  def __add__(self, other):
    return datetime_to_fakedatetime(super(FakeDatetime, self).__add__(other))

  def __sub__(self, other):
    return datetime_to_fakedatetime(super(FakeDatetime, self).__sub__(other))

  def __radd__(self, other):
    return datetime_to_fakedatetime(super(FakeDatetime, self).__radd__(other))

  def __rsub__(self, other):
    return datetime_to_fakedatetime(super(FakeDatetime, self).__rsub__(other))


def datetime_to_fakedatetime(dt):
  # Because (datetime - datetime) produces a timedelta, so check if the result is of the correct type.
  if isinstance(dt, datetime):
    return FakeDatetime(
      dt.year,
      dt.month,
      dt.day,
      dt.hour,
      dt.minute,
      dt.second,
      dt.microsecond,
      dt.tzinfo
    )
  return dt

감사!

에브 게니 제네랄 로프

https://github.com/spulec/freezegun 장고와 함께 작동하는.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

단위 테스트에서 행렬 값을 확인하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

단위 테스트에서 UIImage에 대해 주장하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Python에서이 함수를 단위 테스트하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Spritekit SKSpriteNode 하위 클래스 내에서 스프라이트 장면을 가져 오는 가장 좋은 방법

분류에서Dev

Objective-C에서 단위 테스트를 위해 클래스 확장을 별도의 헤더 파일로 추출하는 것이 좋은 방법입니까?

분류에서Dev

Android에서 픽셀 단위로 png 색상을 변경하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Django 뷰에서 Ajax 요청을 처리하는 가장 좋은 방법

분류에서Dev

Django에서 imageField의 URL을 검색하는 가장 좋은 방법

분류에서Dev

Ruby 단위 테스트를 위해 StringIO 입력을 모의하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

VS2013 Ultimate에서 개발 한 AngularJS 앱을 테스트하기 위해 각도기를 실행하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

pytest에서 테스트를 위해 여러 부울 조합을 지원하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

코드 단위를 테스트 가능하게 만드는 가장 좋은 방법

분류에서Dev

단위 테스트를 만들 때 메서드 내의 모든 호출을 패치하는 것이 좋은 방법입니까?

분류에서Dev

원에 아이콘을 배치하는 가장 좋은 방법

분류에서Dev

Dart에서 RegExp와 일치하는 모든 하위 문자열을 얻는 가장 좋은 방법

분류에서Dev

테스트를 위해 PostgreSQL에서 데이터를 백업 및 복원하는 가장 좋은 방법

분류에서Dev

Redis에서 특정 패턴을 사용하여 키 범위를 얻는 가장 좋은 방법

분류에서Dev

C의 배열에서 하위 배열을 만드는 가장 좋은 방법

분류에서Dev

if 문에서 std :: optional을 테스트하고 래핑 해제하는 가장 좋은 방법

분류에서Dev

reactjs 단위 테스트에서 올바른 값을 주장하는 방법은 무엇입니까?

분류에서Dev

문장에서 시퀀스 단어 목록을 인식하는 가장 좋은 방법 찾기

분류에서Dev

AWS에서 라이브 및 테스트 환경을 분리하는 가장 좋은 방법

분류에서Dev

Sylius Model에 방법을 추가하는 가장 좋은 방법

분류에서Dev

목록의 모든 항목을 C #에서 한 위치 씩 이동하는 가장 좋은 방법

분류에서Dev

1에서 n 값을 두 테이블의 단일 필드로 연결하는 가장 좋은 방법

분류에서Dev

SQLite에서 단 하나의 객체 기록을 저장하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Django에서 간단한 비동기 대기열을 사용하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

로깅을 테스트하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

golang에서 단어를 검열하는 가장 좋은 방법

Related 관련 기사

  1. 1

    단위 테스트에서 행렬 값을 확인하는 가장 좋은 방법은 무엇입니까?

  2. 2

    단위 테스트에서 UIImage에 대해 주장하는 가장 좋은 방법은 무엇입니까?

  3. 3

    Python에서이 함수를 단위 테스트하는 가장 좋은 방법은 무엇입니까?

  4. 4

    Spritekit SKSpriteNode 하위 클래스 내에서 스프라이트 장면을 가져 오는 가장 좋은 방법

  5. 5

    Objective-C에서 단위 테스트를 위해 클래스 확장을 별도의 헤더 파일로 추출하는 것이 좋은 방법입니까?

  6. 6

    Android에서 픽셀 단위로 png 색상을 변경하는 가장 좋은 방법은 무엇입니까?

  7. 7

    Django 뷰에서 Ajax 요청을 처리하는 가장 좋은 방법

  8. 8

    Django에서 imageField의 URL을 검색하는 가장 좋은 방법

  9. 9

    Ruby 단위 테스트를 위해 StringIO 입력을 모의하는 가장 좋은 방법은 무엇입니까?

  10. 10

    VS2013 Ultimate에서 개발 한 AngularJS 앱을 테스트하기 위해 각도기를 실행하는 가장 좋은 방법은 무엇입니까?

  11. 11

    pytest에서 테스트를 위해 여러 부울 조합을 지원하는 가장 좋은 방법은 무엇입니까?

  12. 12

    코드 단위를 테스트 가능하게 만드는 가장 좋은 방법

  13. 13

    단위 테스트를 만들 때 메서드 내의 모든 호출을 패치하는 것이 좋은 방법입니까?

  14. 14

    원에 아이콘을 배치하는 가장 좋은 방법

  15. 15

    Dart에서 RegExp와 일치하는 모든 하위 문자열을 얻는 가장 좋은 방법

  16. 16

    테스트를 위해 PostgreSQL에서 데이터를 백업 및 복원하는 가장 좋은 방법

  17. 17

    Redis에서 특정 패턴을 사용하여 키 범위를 얻는 가장 좋은 방법

  18. 18

    C의 배열에서 하위 배열을 만드는 가장 좋은 방법

  19. 19

    if 문에서 std :: optional을 테스트하고 래핑 해제하는 가장 좋은 방법

  20. 20

    reactjs 단위 테스트에서 올바른 값을 주장하는 방법은 무엇입니까?

  21. 21

    문장에서 시퀀스 단어 목록을 인식하는 가장 좋은 방법 찾기

  22. 22

    AWS에서 라이브 및 테스트 환경을 분리하는 가장 좋은 방법

  23. 23

    Sylius Model에 방법을 추가하는 가장 좋은 방법

  24. 24

    목록의 모든 항목을 C #에서 한 위치 씩 이동하는 가장 좋은 방법

  25. 25

    1에서 n 값을 두 테이블의 단일 필드로 연결하는 가장 좋은 방법

  26. 26

    SQLite에서 단 하나의 객체 기록을 저장하는 가장 좋은 방법은 무엇입니까?

  27. 27

    Django에서 간단한 비동기 대기열을 사용하는 가장 좋은 방법은 무엇입니까?

  28. 28

    로깅을 테스트하는 가장 좋은 방법은 무엇입니까?

  29. 29

    golang에서 단어를 검열하는 가장 좋은 방법

뜨겁다태그

보관