来自nose.tools的assert_raises()将无法正常工作

时间:2017-05-21 07:04:01

标签: python python-2.7

我正在阅读Zed Shaw的“学习Python的艰难之路”一书。本书没有任何关于函数assert_raises()的覆盖范围或文档。

所以我试着运行这个测试:

from nose.tools import *
from ex48.parser import *

def test_except():
    raw_sentence = [('stop', 'the'), ('noun', 'bear'), ('verb', 'kill')]
    assert_raises(ParserError, parse_sentence(raw_sentence))

我尝试运行nosetests时出现错误:

======================================================================
ERROR: tests.parser_tests.test_except
----------------------------------------------------------------------
Traceback (most recent call last):
  File "####/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "####/ex48/tests/parser_tests.py", line 8, in test_except
    assert_raises(ParserError, parse_sentence(raw_sentence))
  File "####/ex48/ex48/parser.py", line 69, in parse_sentence
    obj = parse_object(word_list)
  File "####/ex48/ex48/parser.py", line 53, in parse_object
    raise ParserError("Expected a noun or direction next.")
 ParserError: Expected a noun or direction next.

 ----------------------------------------------------------------------
 Ran 8 tests in 0.008s

 FAILED (errors=1)

以下是异常的来源:

def parse_verb(word_list):
    skip(word_list, 'stop')

    if peek(word_list) == 'verb':
       return match(word_list, 'verb')
    else:
       raise ParserError("Expected a verb next.")

parse_sentence(raw_sentence)的调用预计会失败。 assert_raises()应该正常工作,但它不会捕获parse_verb()引发失败测试的引发异常。您认为/是什么问题?

2 个答案:

答案 0 :(得分:0)

请勿直接致电parse_sentence()。相反,将其作为参数传递。

assert_raises(ParserError, parse_sentence, raw_sentence)

更好的是,在assert_raises()块中使用with。见How to use nose's assert_raises?

答案 1 :(得分:0)

这将起作用

assert_raises(ParserError, parse_verb, raw_sentence)