如何对具有__enter__/__exit__方法的类进行单元测试?

6

我刚接触单元测试,试图找到一种方法来测试我的对象中 with 关键字是否正常工作。

在这种情况下,我的对象有一个 __enter__ 方法,它创建了一个临时目录,还有一个 __exit__ 方法,应该销毁它。 (它还有一个do_stuff 方法,仅用于测试向临时目录写入内容。)

我不太确定如何测试这个。我已经检查过 unittest 模块,甚至以前编写过基础方法的一些测试,但我不确定在这种情况下最好的方法是什么...或者它是否有意义。无论如何,以下是我的对象代码:

import shutil
import tempfile
import os
import glob

class MyObj(object):
    def __enter__(self):
        self.tmpdir = tempfile.mkdtemp(dir='.')
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        shutil.rmtree(self.tmpdir)

    def do_stuff(self):
        new = os.path.join(self.tmpdir, 'new_file.txt')
        with open(new, 'w') as nf:
            nf.write('testing')
        print(glob.glob(self.tmpdir + '/*'))

myobj = MyObj()
with myobj as x:
    x.do_stuff()

1
你具体在问什么?如何进行单元测试?你能展示一下你已经尝试使用unittest模块的努力吗?对于你展示的行为编写测试应该很简单,但你需要将测试代码放在测试用例中,而不是实际类的方法中。另一方面,如果你只是想问如何创建一个临时目录作为上下文管理器,只需使用现有的tempfile.TempDirectory类即可。 - Blckknght
1个回答

4
如果你想测试MyObj是否适用于with语句,并且它会创建/删除临时目录,请在测试方法中使用with语句:
import unittest


class TestMyObj(unittest.TestCase):

    def test_myobj_with_statement__should_create_delete_temp_directory(self):
        with MyObj() as obj:
            # Directory is created
            self.assertTrue(os.path.isdir(obj.tmpdir))
        # Directory is gone
        self.assertFalse(os.path.isdir(obj.tmpdir))

if __name__ == '__main__':
    unittest.main()

谢谢,这就是我一直在寻找的!之前没能够理解,可能是因为我的思维方式有误。=) - KaleidoEscape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接