如何使用nose的assert_raises?

62
我搜寻了相关文档,但没有找到什么有用的信息。有一些文档并没有提供太多解释。请问有人可以解释一下Nose的相关内容吗?
assert_raises(what should I put here?)

什么是函数以及如何使用它?

2个回答

98

虽然被接受的答案是正确的,但我认为 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!')

9
谢谢让我学到了新东西。 - user1544624
我想看到异常的消息。我从cm.exception获取的ex没有ex.message。但是异常确实被引发了一个消息。出了什么问题? - akshitBhatia

72

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

例如,如果您有一个函数add,用于将两个数字相加,当您传递一个整数和一个字符串时,它应该抛出一个TypeError异常。因此:

from nose.tools import assert_raises

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

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

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

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


1
好的,谢谢!但是你是否知道一个好的 Nose 文档链接,我可以查看其他 Nose 函数,例如 assert_equal、assert_raises?@kindall - user1544624
1
我也找到了同样的问题。你可以尝试使用 help(assert_rases) - kindall
6
在http://nose.readthedocs.org/en/latest/testing_tools.html#module-nose.tools的第一段中,有这样一句话:“...还有unittest.TestCase中所有相同的assertX方法(只是用PEP 8的方式拼写,所以是assert_equal而不是assertEqual)。”。以下是该列表: http://docs.python.org/2/library/unittest.html#assert-methods - Carles Barrobés
1
安装pydoc。然后运行pydoc nose.tools将会展示给你手册。 :D - Shiplu Mokaddim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接