【问题标题】:Unittest in Django. How to get the exception message from assertRaises()?Django 中的单元测试。如何从 assertRaises() 获取异常消息?
【发布时间】:2010-04-22 15:57:03
【问题描述】:

我使用了assertRaises()来验证会有异常抛出,这个没有问题。

我的问题是,有没有办法从 assertRaises() 获取异常消息?我也想通过解析异常消息来断言不同类型的异常。

【问题讨论】:

    标签: django unit-testing


    【解决方案1】:

    我使用以下装饰器,灵感来自nose

    def raises(exception, message):
        @decorator
        def decorate(func, *args, **kwargs):
            name = func.__name__
            try:
                func(*args, **kwargs)
            except exception, e:
                if message is not None:
                    assert_equal(str(e), message)
            except:
                raise
            else:
                msg = "%s() did not raise %s" % (name, exception.__name__)
                raise AssertionError(msg)
        return decorate
    

    所以我可以这样做:

    class TestMyThing(TestCase):
        @raises(ValueError, "T should not exceed 100, but has value 120")
        def test(self):
            some_code_that_provoke_exception()
    

    @decorator 来自 decorator 包。如果出于某种原因不想引入依赖项,可以手动编写装饰器。

    【讨论】:

      【解决方案2】:

      如果不同的异常消息构成不同的可测试条件,它们可能应该是两个不同的异常。但是,它们可以轻松地从相同的异常基类继承,因此您的其他异常处理代码不一定需要更改。

      【讨论】:

        【解决方案3】:

        我只是想出了解决方案,只是创建一个包装类,并使用它来断言异常。

        @staticmethod
        def assertRaises(exception, apicall, *args, **kwargs):
            try:
                apicall(*args, **kwargs)
            except exception as e:
                return e
            finally:
                pass;
        

        【讨论】:

          猜你喜欢
          • 2017-01-19
          • 1970-01-01
          • 2014-09-22
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 2011-07-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多