我正在阅读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()
引发失败测试的引发异常。您认为/是什么问题?
答案 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)