我有一个满是测试的类,这些测试以with子句开始,以设置一组复杂的环境和资源。每一行with都很长且重复。
我想把它们转换成setUp()和teardDown()这样的单一实现
从本质上讲,我想要的东西如下:
def setUp(self):
self.unit = # some long initialisation
def tearDown(self):
self.unit.__exit__()例如:假设这被简化为使用open()
class SomeTest(unittest.TestCase):
def test_1(self):
with open('filename', 'r') as f:
# do testing with f
...
def test_100(self):
with open('filename', 'r') as f:
# do testing with f我会将其转换为:
class SomeTest(unittest.TestCase):
def setUp(self):
self.f = open("filename', 'r')
def tearDown(self):
self.f.close()
def test_1(self):
# do testing with self.f
...
def test_100(self):
# do testing with self.f现在这是可行的,因为文件有一个通用的、容易重现的__exit__对等物,即close()。
在我们的例子中,__exit__处理程序相当复杂,依赖于类型,并且是有状态的-而且(除了测试目的)我们不想公开类似close()的应用程序接口(因为那样会增加有状态的复杂性),并且会允许客户端不按设计使用with子句。
有什么方法可以适当地调用__exit__吗?或者在每个测试用例周围集成with as子句?
发布于 2019-08-12 15:19:29
正如我所说的,我认为在tearDown方法中调用self.cm.__exit__(None, None, None)会很好地工作。
def tearDown(self):
self.cm.__exit__(None, None, None)然而,我开始考虑另一种你可以尝试的模式:
from contextlib import contextmanager
import unittest
class SomeTest(unittest.TestCase):
@contextmanager
def harness(self):
with open('file.txt', 'r') as f1, open('file2.txt', 'w') as f2:
try:
yield f1, f2
finally:
pass
def test_one(self):
with self.harness() as (f1, f2):
pass发布于 2019-08-13 14:09:26
最后,装饰器可能比setUp、tearDown更优雅(跳过了很多参数)
def with_single_unit(fn):
@functools.wraps(fn)
def with_single_unit_(self):
with SingleUnitStage(lotsa_args_skipped).select(lotsa_args_skipped) as unit:
self.unit = unit
fn(self)
return with_single_unit_
class SomeTest(unittest.TestCase):
@with_single_unit
def test_a(self):
# use self.unit
@with_single_unit
def test_b(self):
# use self.unit
@with_single_unit
def test_c(self):
# use self.unithttps://stackoverflow.com/questions/57456732
复制相似问题