2012-08-31 6 views
0

나는 장고 모델에서 현재 시간에 상대적인 계산을하는 메소드를 가지고있다.unitttest를 사용하여 Python에서 상대 시간을 계산하는 메서드를 테스트하는 방법은 무엇입니까?

def next_date(): 
    now = datetime.now() 
    trial_expires = max(self.date_status_changed + timedelta(self.trial_days), now) 
    return timezone.datetime(trial_expires.year, trial_expires.month+1, 1, tzinfo=trial_expires.tzinfo) 

유닛 테스트에 사용 장고/파이썬이를 테스트하는 적절한 방법은 무엇입니까 : 여기 조각은 무엇입니까? 내가 뭘하고 싶은지 테스트에서 "지금"에 대한 몇 가지 값을 하드 코딩 할 수 있도록 다양한 가장자리 경우를 시도 할 수 있습니다. 이상적으로는 테스트에서 현재 시간과 날짜에 의존하는 것을 피하고 싶습니다.

한 가지 방법은 내 메서드가 사용하는 'now'값을 재정의하는 선택적 매개 변수를 허용하도록 수정하는 것입니다. 파이썬 내 메서드 서명을 수정하지 않고도 비슷한 기능을 수행합니까?

def next_date(nowfunc=datetime.now): 
    now = nowfunc() 
    ... 

또는 클래스 '종속성으로 :

답변

1

당신은 매개 변수로 datetime.now()를 추출 할 수

class X: 
    def __init__(self, nowfunc=datetime.now): 
     self._nowfunc = nowfunc 

def next_date(self): 
    now = self._nowfunc() 
    ... 

그리고 당신의 시험에서 필요한 결과 모의 기능을 전달합니다.

그러나 당신이 서명을 수정하지 않을 경우, 사용 patches :

@patch.object(datetime, 'now') 
def test_next_date(self, nowfunc): 
    nowfunc.return_value = ... # required result 
    # the rest of the test 
+0

음, 즉 @patch이 무엇 정확히 (BTW, 모의 정말 적절한 TDD에 대한 대체 할 수없는 유용한 라이브러리이다). 하지만 개인적으로 명시 적 종속성을 선호합니다. 그 이유는 테스트 내부를 메소드 내부 (즉, 함수가 사용하는 함수)에 덜 의존하게 만들었 기 때문입니다. 이는 더 나은 디자인의 표시입니다. – bereal

+0

"명백한 의존성"이란 무엇을 의미합니까? –

+0

내 말은, 메소드/생성자 인수 (Dependency Inversion) 또는 클래스 속성을 통해 외부에서 명시 적으로 종속성을 전달할 수 있으며 원하는대로 임의로 대체 할 수 있습니다. 시험용. – bereal