我发现我在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()
中,不需要为每个测试方法重复相同的代码(我可以看到在每个方法上重复一个装饰器可以实现它)。
编辑:请将被测试对象视为内部对象,将GetResource
对象视为第三方对象(我们不会对其进行更改)。
我已经将GetSlot
重命名为GetResource
,这是一个更通用的名称,其中上下文管理器是使该对象进入锁定状态和退出锁定状态的方式。
setUp
/tearDown
方法有什么问题,对我来说看起来完全没问题。我想另一种选择是创建一个使用with
语句的装饰器,并自动将其应用于所有方法,但这会增加更多的工作量而没有实际好处。 - interjay