Я обнаружил, что использую множество менеджеров контекста в 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 (single point истины / не повторяйтесь), я бы хотел реорганизовать эти биты в тестовые методы setUp ()
и tearDown ()
.
Однако попытка сделать это привела к этому уродству:
def setUp(self):
self._resource = GetSlot()
self._resource.__enter__()
def tearDown(self):
self._resource.__exit__(None, None, None)
Должен быть лучший способ сделать это. В идеале в setUp ()
/ tearDown ()
без повторяющихся битов для каждого метода тестирования (я вижу, как это может сделать повторение декоратора для каждого метода).
Редактировать: Считайте, что недо тестируемый объект является внутренним, а объект GetResource
- сторонней вещью (которую мы не меняем).
Я переименовал GetSlot
в GetResource
здесь - это более общий, чем конкретный случай - где диспетчеры контекста - это способ, которым объект должен перейти в заблокированное состояние и из.