发布于2019-08-25 21:57 阅读(737) 评论(0) 点赞(3) 收藏(0)
我发现我在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
here-这比特定情况更通用 - 其中上下文管理器是对象打算进入锁定状态的方式。
unittest.TestCase.run()
如下所示覆盖怎么样?这种方法不需要调用任何私有方法或对每个方法执行某些操作,这就是提问者想要的。
from contextlib import contextmanager
import unittest
@contextmanager
def resource_manager():
yield 'foo'
class MyTest(unittest.TestCase):
def run(self, result=None):
with resource_manager() as resource:
self.resource = resource
super(MyTest, self).run(result)
def test(self):
self.assertEqual('foo', self.resource)
unittest.main()
TestCase
如果要在TestCase
那里修改实例,此方法还允许将实例传递给上下文管理器。
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/59742/eb08b41929a91ff4fdf7/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!