module.py:
Код: Выделить всё
from enabled import is_enabled
FLAGS = {flag : is_enabled(flag) for flag in ("foo", "bar")}
if FLAGS.get("foo"):
def baz():
print("New baz")
else:
def baz():
print("Old baz")
print(f"Loaded module with {FLAGS=}")
print("#"*100)
< /code>
Enabled.py:
def is_enabled(_):
return True
Я пробовал: < /p>
Создание декоратора: это терпит неудачу, потому что методы установки и разрыва не вызываются между повторяющимися прогонами в декораторе, что приводит к неудаче. Я могу либо назвать self.setup и self.teardown в каждом тесте, либо передавать эти методы декоратору и назвать их, но это похоже на грязный подход, который создает зависимости и хрупкий. Я собираюсь избежать этого, если это возможно. Я не уверен, возможно ли это / как использовать свой собственный тестовый бегун вместо существующего тестового бегуна (который не может быть легко заменен / рефактирован, поскольку он много используется). Есть ли способ для меня переопределить / игнорировать это и использовать свой собственный? Этот подход более чистый и технически более правильный, так как тестовый набор запускается несколько раз со всеми необходимой настройкой/разрывом, захваченными результатами и т. Д. False ?
Код: Выделить всё
import module
from importlib import reload
from unittest import TestCase
from itertools import product
from functools import wraps, partial
from unittest.mock import patch, DEFAULT
def run_all_combinations_decorator(func):
flags = sorted(module.FLAGS.keys())
combinations = list(product((True, False), repeat=len(flags)))
def is_enabled(new_flags, flag):
return new_flags.get(flag, DEFAULT)
@wraps(func)
def wrapper(*args, **kwargs):
for combination in combinations:
new_flags = {flag: enabled for flag, enabled in zip(flags, combination)}
print(f"Running with {new_flags=}")
with patch("enabled.is_enabled", side_effect=partial(is_enabled, new_flags)):
reload(module)
result = func(*args, **kwargs) # Not ideal as only the last result is captured
return result
return wrapper
class ModuleTests(TestCase):
def setUp(self):
self.x = 0
@run_all_combinations_decorator
def test_baz(self):
# self.setUp() # Uncommenting this makes the test pass but is not ideal
module.baz()
self.x += 1
self.assertEqual(self.x, 1) # Fails because setup is not called between runs
Подробнее здесь: https://stackoverflow.com/questions/797 ... ture-flags