Предположим, у вас есть модуль Python, который в какой-то момент вызывает методы, имеющие побочные эффекты, такие как запись в файл. Допустим, вы хотите иметь режим пробного запуска, в котором он только делает вид, что делает то, что должен, но на самом деле этого не делает. Как следует реализовать этот аспект пробного прогона, который проявляется в разных методах.
например,
Код: Выделить всё
import os.path
class Foo
def ReadSomething(self):
with open('/some/path', 'r') as f:
print f.read()
def WriteSomething(self, content):
if not os.path.isfile('/some/path'):
with open('/some/path', 'w') as f:
f.write(content)
Поэтому я подумал об использовании библиотеки unittest.mock для исправления всех внешних API на лету на основе такой переменной, как Dry_run.
Это что-то вроде:
Код: Выделить всё
@DryRunPatcher('open')
@DryRunPatcher(os.path, 'isfile', return_value=True)
def WriteSomething(self, content, mock_isfile, mock_open):
Тогда DryRunPatcher будет выглядеть примерно так:
Код: Выделить всё
def DryRunPatcher(*patch_args, **patch_kwargs):
def Decorator(func):
def PatchIfDrunRun(*args, **kwargs):
self_arg = args[0] # assuming it's a method
if self_arg._dry_run_mode:
with mock.patch.object(*patch_args, **patch_kwargs):
return func(*args, **kwargs)
else:
return func(*args, **kwargs)
return PatchIfDryRun
return Decorator
Приведенный выше код может не работать, но суть вы поняли. Однако проблема в том, что, я думаю, макет будет использоваться только для модульного тестирования. Что еще можно использовать для исправления внешних API для реализации режима пробного запуска? Я предпочитаю, чтобы сам метод не зависел от режима пробного запуска, и мне не приходилось оборачивать каждый вызов побочным эффектом.
Подробнее здесь:
https://stackoverflow.com/questions/236 ... sing-mocks