Django的单元测试。如何从assertRaises()获取异常消息?

时间:2010-04-22 15:57:03

标签: django unit-testing

我使用assertRaises()来验证是否会抛出异常并且没有问题。

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

3 个答案:

答案 0 :(得分:2)

我使用以下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个包裹。如果你不想出于某种原因引入依赖,你可以手工编写装饰器。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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