如何使用nose的assert_raises?

时间:2012-08-01 21:36:44

标签: python nosetests

我搜索了文档,但找不到任何文档。有几个没有解释太多。

有人可以向我解释Nose的

assert_raises(what should I put here?)

功能以及如何使用它?

2 个答案:

答案 0 :(得分:90)

虽然接受的答案是正确的,但我认为assert_raises方法有更好的用途。

如果您只是想断言发生异常,那么使用@raises语法可能更简单,更清晰。

@raises(HTTPError)
def test_exception_is_raised:
    call_your_method(p1, p2)

但是,假设您希望对引发的异常执行更多操作,例如:我们需要声明引发的HTTPError类型为 401:未授权,而不是 500:服务器错误

在上述情况下,语法没有用,我们应该使用assert_raises,但方式不同。 如果我们没有传递callable作为第二个参数assert_raises将返回一个上下文,我们可以使用它来进一步测试异常细节。

def test_exception_is_raised:
    with assert_raises(HTTPError) as cm:
         call_your_method(p1, p2)
    ex = cm.exception # raised exception is available through exception property of context
    ok_(ex.code == 401, 'HTTPError should be Unauthorized!')

答案 1 :(得分:65)

assert_raises()函数测试以确保函数调用在显示某些参数时引发指定的异常。

例如,如果你有一个函数add可以添加两个数字,那么当你传递它时,它应该会引发一个TypeError,比如一个整数和一个字符串。所以:

from nose.tools import assert_raises

def add(x, y):
    return x + y

assert_raises(TypeError, add, 2, "0")

第一个参数是您期望的异常类型。第二个是呼叫功能。其余参数将传递给函数(在这种情况下,它们将在函数内变为xy

如果函数引发了预期的异常,则断言通过。