61

我搜索了文档,但找不到任何文档。有一对没有过多解释。

谁能给我解释一下鼻子的

assert_raises(what should I put here?)

功能以及如何使用它?

4

2 回答 2

97

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

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

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

但是,假设您想对引发的异常做更多的事情,例如:我们需要断言引发的 HTTPError 的类型为401: Unauthorized,而不是500: Server Error

在这种情况下,上面的语法没有那么有用,我们应该assert_raises以不同的方式使用 but。如果我们不将它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!')
于 2013-10-11T04:45:10.010 回答
72

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

例如,如果您有一个add将两个数字相加的函数,它可能会TypeError在您传递它时引发 a,例如,一个整数和一个字符串。所以:

from nose.tools import assert_raises

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

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

第一个参数是您期望的异常类型。第二个是要调用的函数。其余参数将传递给函数(在这种情况下,它们将成为x函数y内部)。

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

于 2012-08-01T21:57:59.177 回答