Реализация режима пробного запуска в Python с использованием макетовPython

Программы на Python
Ответить
Anonymous
 Реализация режима пробного запуска в Python с использованием макетов

Сообщение Anonymous »

Предположим, у вас есть модуль 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»