1

好的,问题来了:在Zed Shaw 的“Learn Python the Hard Way”的练习 49assert_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)before 函数。它也不太有效,并产生了相同的输出。

像这样创建一个单独的测试有助于消除错误:

def parse_verb_fail():
    fail_list = [('north', 'direction'), ('go', 'verb')]
    assert_raises(ParserError, parse_verb, fail_list)

但现在测试被简单地忽略了。

我究竟做错了什么?

4

2 回答 2

5

我相信你的问题是它ParserError没有一个接受字符串的构造函数(或者ParserError没有扩展Exception并试图将字符串传递给基础对象的 init 方法......)。因此,当您尝试创建时,ParserError您得到的是 aTypeError而不是ParserError. 因为你assert_raises()没有预料到TypeError它没有抓住它。

编辑:

查看您链接并玩弄的示例代码。你确定你有...

class ParserError(Exception): pass

...并不是...

class ParserError(object): pass
于 2013-04-24T13:15:34.483 回答
0

Zed Shaw 的 Learn Python the Hard Way 仍然是一个很好的资源,所以也许我的贡献会有所帮助。

parse_verb_fail 函数被忽略的原因是鼻子测试函数的名称中必须有“test_”,或者正如文档所说的那样:

任何与配置的 testMatch 正则表达式匹配的函数或类 ((?:^|[\b_\.-])[Tt]est 默认情况下 - 即在单词边界处具有 test 或 Test 或在 - 或 _ 之后并且生活在一个也匹配该表达式的模块中,将作为测试运行。

这是我的解决方案:

def test_parse_errors():
    subject_fail_list = [('stop', 'the'), ('direction', 'north')]
    assert_raises(parser.ParseError, parser.parse_subject, subject_fail_list)

鼻子会运行这个测试,它会通过。将其中一个元组更改为 ('noun', 'john') 将导致测试失败,因为 parse_subject 正在寻找 'noun'。

于 2019-02-14T16:19:29.110 回答