python UnitTest-如何转换;加上;要设置/拆卸的子句

python UnitTest-如何转换;加上;要设置/拆卸的子句,python,python-unittest,Python,Python Unittest,我有一个充满测试的类,它以with子句开始,以设置一组复杂的环境和资源。每一行都很长而且重复 我想将它们转换为单个实现,如setUp()和teardDown() 基本上我想要的是: def setUp(self): self.unit = # some long initialisation def tearDown(self): self.unit.__exit__() 例如:假设这被简化为使用open() 类SomeTest(unittes

我有一个充满测试的类,它以
with
子句开始,以设置一组复杂的环境和资源。每一行都很长而且重复

我想将它们转换为单个实现,如
setUp()
teardDown()

基本上我想要的是:

    def setUp(self):
        self.unit = # some long initialisation

    def tearDown(self):
        self.unit.__exit__()
例如:假设这被简化为使用
open()

类SomeTest(unittest.TestCase):
def测试_1(自身):
将open('filename','r')作为f:
#用f做测试
...
def测试_100(自身):
将open('filename','r')作为f:
#用f做测试
我会把它转换成:

类SomeTest(unittest.TestCase):
def设置(自):
self.f=打开(“文件名”,“r”)
def拆卸(自):
self.f.close()
def测试_1(自身):
#使用self.f进行测试
...
def测试_100(自身):
#使用self.f进行测试
现在,这是因为该文件有一个通用的、易于复制的
\uuuuuuuuuuuuuuuuuuuuu
等价物,即
close()

在我们的例子中,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
处理程序相当复杂,依赖于类型,并且是有状态的,并且(除了测试目的之外)我们不想公开类似


是否有某种方法可以适当地调用
\uuu exit\uuu
?或者在每个测试用例周围将
与as
子句集成?

正如我所评论的,我认为在
tearDown
方法中调用
self.cm.\uu exit\uu(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

正如我所评论的,我认为在
tearDown
方法中调用
self.cm.\uuu退出(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

最后,装饰程序可能比
设置
拆卸
(跳过许多参数)更优雅


最后,装饰程序可能比
设置
拆卸
(跳过许多参数)更优雅


你试过打电话给self.cm.\uuu exit.\uuu(无,无,无)?不,我没有-我期待有更优雅的东西你试过打电话给self.cm.\uu exit.\uu(无,无,无)?不,我没有-我期待有更优雅的东西谢谢-
\uu exit.\uu(无,…)
可能确实有效,但它似乎不“正确”-我希望找到更优雅的解决方案。您有一个避免复杂行的好例子。我还将研究测试的直接装饰。谢谢-
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(无)
可能确实有效,但它似乎不“正确”“-我希望有更优雅的解决方案。你有一个很好的例子来避免复杂的线。我还将研究测试的直接装饰。