gpt4 book ai didi

python - Nose 工具中的 assert_raises() 并没有真正起作用

转载 作者:太空宇宙 更新时间:2023-11-04 09:10:16 25 4
gpt4 key购买 nike

好的,问题来了:在exercise 49在 Zed Shaw 的“Learn Python the Hard Way”一文中,我们需要使用 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

关于python - Nose 工具中的 assert_raises() 并没有真正起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16192502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com