Есть ли в Python подходящая идиома для использования диспетчеров контекста в настройке / разборке?

Я обнаружил, что использую множество менеджеров контекста в 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 здесь - это более общий, чем конкретный случай - где диспетчеры контекста - это способ, которым объект должен перейти в заблокированное состояние и из.

47
задан Zearin 20 April 2013 в 14:24
поделиться