好的,这就是问题所在:在Zed Shaw的“学习Python的艰难方法”的exercise 49中,我们需要使用assert_raises()
测试几个异常。这是我正在测试的函数,如果省略assert_raises()
部分,它将通过测试:
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.")
这是测试功能和臭名昭著的
assert_raises()
行:def parse_verb_test():
vrb_list = [('of', 'stop'), ('from', 'stop'), ('go', 'verb'), ('north', 'direction')]
assert_equal(parse_verb(vrb_list), ('go', 'verb'))
assert_equal(vrb_list, [('north', 'direction')])
assert_raises(ParserError, parse_verb, vrb_list)
它给了我以下输出:
.........E...
======================================================================
ERROR: tests.parser_tests.parse_verb_test
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
File "/Users/vsevolod/Repositories/ex48/tests/parser_tests.py", line 20, in parse_verb_test
assert_raises(ParserError, parse_verb, vrb_list)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 471, in assertRaises
callableObj(*args, **kwargs)
File "/Users/vsevolod/Repositories/ex48/ex48/parser.py", line 40, in parse_verb
raise ParserError("Expected a verb next.")
TypeError: object.__new__() takes no parameters
----------------------------------------------------------------------
Ran 13 tests in 0.042s
FAILED (errors=1)
我还尝试摆脱
assert_raises()
行,并在函数之前使用@raises(ParserError)
。它也不是很有效,并且导致了相同的输出。像这样创建一个单独的测试有助于消除错误:
def parse_verb_fail():
fail_list = [('north', 'direction'), ('go', 'verb')]
assert_raises(ParserError, parse_verb, fail_list)
但是现在测试已被忽略。
我究竟做错了什么?
最佳答案
我相信您的问题是ParserError
没有采用字符串的构造函数(或者ParserError
没有从Exception
扩展,而是试图将字符串传递给基础对象的init方法...)。因此,当您尝试创建ParserError
时,会得到一个TypeError
而不是ParserError
。由于您的assert_raises()
没想到有TypeError
,因此无法捕获它。
编辑:
查看您链接并在其中玩耍的示例代码。你确定你有...
class ParserError(Exception): pass
...并不是...
class ParserError(object): pass