2016-10-30 4 views
0

일부 사용자 정의 패치 mock.patch 패치 설정의 복사 붙여 넣기로 내 테스트 코드를 번거롭게 반복해서 사용하고 싶습니다. 예 : this very handy patch of datetime.date, 날짜에 적응하는, 내가 한 줄 호출로이 기능을 래핑 수있는 방법`mock.patch`에 대한 래퍼 만들기

with patch('mymodule.datetime') as mock_datetime: 
    mock_datetime.datetime.utcnow.return_value = datetime.datetime(2010, 10, 8, 9, 10) 
    mock_date.datetime.side_effect = lambda *args, **kw: datetime.datetime(*args, **kw) 

내 코드를 채울 것인가?

답변

0

다음은이를위한 자원 관리자 클래스입니다. 테스트 클래스와는 별도의 파일에 넣으려고 할 수 있으므로 inspect을 사용하여 호출 모듈을 조회하여 올바른 대상 모듈 이름을 mock.patch으로 전달할 수 있습니다.

import datetime 
import inspect 
# import mock according to your python version 

class mock_datetime(object): 

    def __init__(self, target, new_utcnow): 
     self.new_utcnow = new_utcnow 
     self.target = target 

    def __enter__(self): 
     calling_module = inspect.getmodule(inspect.stack()[1][0]) 
     target_from_here = calling_module.__name__ + '.' + self.target 
     self.patcher = mock.patch(target_from_here) 
     mock_dt = self.patcher.start() 
     mock_dt.datetime.utcnow.return_value = self.new_utcnow.replace(tzinfo=None) 
     mock_dt.datetime.side_effect = lambda *args, **kw: datetime.datetime(*args, **kw) 
     return mock_dt 

    def __exit__(self, *args, **kwargs): 
     self.patcher.stop() 

그런 다음

with mock_datetime('mymodule.datetime', datetime.datetime(2016, 3, 23)): 
    assert mymodule.datetime.datetime.utcnow() == datetime.datetime(2016, 3, 23) 
로 호출 할 수 있습니다