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')
setUp()これが多くのテストに到達すると、明らかに退屈になるので、SPOT / DRY(信頼できる唯一の情報源/繰り返してはいけない)の精神で、これらのビットをテストとtearDown()メソッドにリファクタリングしたいと思います。
しかし、それを行おうとすると、この醜さにつながります。
def setUp(self):
self._resource = GetSlot()
self._resource.__enter__()
def tearDown(self):
self._resource.__exit__(None, None, None)
これを行うためのより良い方法があるはずです。理想的には、各テストメソッドの反復ビットなしのsetUp()/tearDown()で(各メソッドでデコレータを繰り返すことでどのように実行できるかがわかります)。
編集:アンダーテストオブジェクトは内部のものであり、GetResourceオブジェクトはサードパーティのものであると考えてください(これは変更していません)。
ここに名前を変更GetSlotしGetResourceました—これは特定の場合よりも一般的です—コンテキストマネージャーは、オブジェクトがロック状態になり、ロックアウトすることを目的とした方法です。