如何使用nose的assert_raises?

use*_*624 53 python nosetests

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

有人可以向我解释鼻子吗?

assert_raises(what should I put here?)
Run Code Online (Sandbox Code Playgroud)

功能以及如何使用它?

Bud*_*hiP 91

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

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

@raises(HTTPError)
def test_exception_is_raised:
    call_your_method(p1, p2)
Run Code Online (Sandbox Code Playgroud)

但是,假设您希望对引发的异常执行更多操作,例如:我们需要声明引发的HTTPError类型为401:Unauthorized,而不是500:Server Error.

在这种情况下,上面的语法没有用,我们应该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!')
Run Code Online (Sandbox Code Playgroud)

  • 谢谢告诉我一些新的东西. (8认同)

kin*_*all 66

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

例如,如果你有一个add添加两个数字的函数,它应该TypeError在你传递它时引发一个整数和一个字符串.所以:

from nose.tools import assert_raises

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

assert_raises(TypeError, add, 2, "0")
Run Code Online (Sandbox Code Playgroud)

第一个参数是您期望的异常类型.第二个是呼叫功能.的参数的其余部分将被传递给函数(在这种情况下,他们将成为x并且y在函数内部).

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

  • 有点隐藏,但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 (6认同)