首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python assertRaises中使用上下文管理器

在Python assertRaises中使用上下文管理器
EN

Stack Overflow用户
提问于 2011-11-22 01:10:20
回答 4查看 11.4K关注 0票数 12

unittest的Python文档暗示assertRaises()方法可以用作上下文管理器。下面的代码给出了一个来自Python文档的单元测试的简单示例。testsample()方法中的assertRaises()调用运行良好。

现在我想在异常被引发时访问它,但是如果我注释掉它,而不是注释下一个我试图使用上下文管理器的块,当我试图执行代码时,我会得到一个AttributeError: __exit__。Python 2.7.2和3.2.2都会发生这种情况。我可以捕获try...except块中的异常并以这种方式访问它,但unittest的文档似乎暗示上下文管理器也会这样做。

我还有什么地方做错了吗?

代码语言:javascript
复制
class TestSequenceFunctions(unittest.TestCase):

    def setUp(self):
        self.seq = [x for x in range(10)]

    def testshuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, [x for x in range(10)])

    def testchoice(self):
        element = random.choice(self.seq)
        self.assert_(element in self.seq)

    def testsample(self):
        self.assertRaises(ValueError, random.sample, self.seq, 20)

        # with self.assertRaises(ValueError, random.sample, self.seq, 20):
        #     print("Inside cm")

        for element in random.sample(self.seq, 5):
            self.assert_(element in self.seq)

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

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-22 01:16:45

source code for unittest不显示assertRaises的异常挂钩

代码语言:javascript
复制
class _AssertRaisesContext(object):
    """A context manager used to implement TestCase.assertRaises* methods."""

    def __init__(self, expected, test_case, expected_regexp=None):
        self.expected = expected
        self.failureException = test_case.failureException
        self.expected_regexp = expected_regexp

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, tb):
        if exc_type is None:
            try:
                exc_name = self.expected.__name__
            except AttributeError:
                exc_name = str(self.expected)
            raise self.failureException(
                "{0} not raised".format(exc_name))
        if not issubclass(exc_type, self.expected):
            # let unexpected exceptions pass through
            return False
        self.exception = exc_value # store for later retrieval
        if self.expected_regexp is None:
            return True

        expected_regexp = self.expected_regexp
        if isinstance(expected_regexp, basestring):
            expected_regexp = re.compile(expected_regexp)
        if not expected_regexp.search(str(exc_value)):
            raise self.failureException('"%s" does not match "%s"' %
                     (expected_regexp.pattern, str(exc_value)))
        return True

因此,正如您所怀疑的那样,如果您想要在保留assertRaises测试的同时拦截异常,那么形成自己的try/except块是可行的:

代码语言:javascript
复制
def testsample(self):
    with self.assertRaises(ValueError):
         try:
             random.sample(self.seq, 20)
         except ValueError as e:
             # do some action with e
             self.assertEqual(e.args,
                              ('sample larger than population',))
             # now let the context manager do its work
             raise                    
票数 7
EN

Stack Overflow用户

发布于 2012-11-27 21:27:52

似乎还没有人建议:

代码语言:javascript
复制
import unittest
# For python < 2.7, do import unittest2 as unittest

class Class(object):
    def should_raise(self):
        raise ValueError('expected arg')

class test_Class(unittest.TestCase):
    def test_something(self):
        DUT = Class()
        with self.assertRaises(ValueError) as exception_context_manager:
            DUT.should_raise()
        exception = exception_context_manager.exception

        self.assertEqual(exception.args, ('expected arg', ))

我通常用e_cm作为exception_context_manager的缩写。

票数 26
EN

Stack Overflow用户

发布于 2011-11-22 01:16:32

根据文档:

如果在省略callableObj或无的情况下调用

,则将返回上下文对象

所以代码应该是:

代码语言:javascript
复制
with self.assertRaises(ValueError):
    random.sample(self.seq, 20)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8215653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档