好的,这就是问题所在:在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

07-26 04:18