2016-10-30 3 views
0

Некоторые настраиваемые исправления от mock.patch Я хочу использовать снова и снова, не засоряя свой тестовый код с помощью копий патчей установки патча. например this very handy patch of datetime.date, который адаптирован для DateTime, наполнит мой код сСоздание обертки для `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) 
Смежные вопросы