Я нахожу, что я использую множество менеджеров контекста в Python. Тем не менее, я тестировал несколько вещей, используя их, и мне часто нужно следующее:
class MyTestCase(unittest.TestCase):
def testFirstThing(self):
with GetResource() as resource:
u = UnderTest(resource)
u.doStuff()
self.assertEqual(u.getSomething(), 'a value')
def testSecondThing(self):
with GetResource() as resource:
u = UnderTest(resource)
u.doOtherStuff()
self.assertEqual(u.getSomething(), 'a value')
Когда это дойдет до многих тестов, это, очевидно, станет скучным, поэтому в духе SPOT/DRY (единственная точка правды/не повторяйте себя) я бы захотел реорганизовать эти биты в тест setUp()
и tearDown()
.
Однако попытка сделать это привела к этому уродству:
def setUp(self):
self._resource = GetSlot()
self._resource.__enter__()
def tearDown(self):
self._resource.__exit__(None, None, None)
Должен быть лучший способ сделать это. В идеале, в setUp()
/tearDown()
без повторяющихся битов для каждого тестового метода (я вижу, как это может сделать повторение декоратора для каждого метода).
Изменить:. Рассмотрим объект underest как внутренний, а объект GetResource
- вещь третьей стороны (которую мы не меняем).
Я переименовал GetSlot
в GetResource
здесь - это более общий, чем специфический контекст-контекст, где контекстные менеджеры - это способ, которым объект предназначен для перехода в заблокированное состояние и выход.