gpt4 book ai didi

python unittest.TestCase.assertRaises 不工作

转载 作者:行者123 更新时间:2023-11-28 22:33:54 29 4
gpt4 key购买 nike

我正在尝试在 Python 中对我的“添加”函数运行测试,但出现错误:

7
E
======================================================================
ERROR: test_upper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/MaZee/PycharmProjects/andela/asdasd.py", line 22, in test_upper
self.assertEqual("Input should be a string:", cm.exception.message , "Input is not a string:")
AttributeError: '_AssertRaisesContext' object has no attribute 'exception'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

Process finished with exit code 1

这是我的代码:

    import unittest

def add(a,b):
"""
Returns the addition value of a and b.
"""
try:
out = a + b
except TypeError:
raise TypeError("Input should be a string:")

print (out)
return



class TestStringMethods(unittest.TestCase):

def test_upper(self):
with self.assertRaises(TypeError) as cm:
add(3,4)
self.assertEqual("Input should be a string:", cm.exception.message , "Input is not a string:")


if __name__ == '__main__':
unittest.main()

最佳答案

正如错误消息告诉您的那样,您的assert raises 对象没有属性exception。更具体地说,这个电话:

cm.exception.message

cm 在这种情况下是您的断言对象,并且因为您正在测试的代码实际上从未引发过,所以您的 cm 对象不会有 exception 您尝试访问的属性。

现在,我们来谈谈为什么会这样。您正在尝试测试在 add 方法中引发 exception 时会发生什么情况,以便引发 TypeError。但是,如果您查看测试用例,就会将两个有效整数传递给 add 方法。您不会引发异常,因为这是一个有效的测试用例。

对于您的单元测试,您要测试当您raise 某些东西时会发生什么,即将无效数据插入add 方法。再次尝试您的代码,但这次在您的单元测试中,通过以下内容:

add(5, 'this will raise')

您现在将得到您的TypeError

您还需要在上下文管理器之外执行断言验证:

def test_upper(self):
with self.assertRaises(TypeError) as cm:
add(3, 'this will raise')
self.assertEqual("Input should be a string:", cm.exception.message, "Input is not a string:")

您现在将遇到另一个问题。没有 message 属性。您应该简单地检查 cm.exception。此外,在您的 add 方法中,您的字符串是:

"Input should be a string:"

但是,您正在检查它是:

"Input is not a string:"

因此,一旦您将单元测试更正为使用 cm.exception,您现在将面临:

AssertionError: 'Input should be a string:' != TypeError('Input should be a string:',) : Input is not a string:

因此,您的断言应该通过在 cm.exception 上调用 str 来检查异常字符串:

self.assertEqual("Input should be a string:", str(cm.exception), "Input should be a string:")

所以,你的完整测试方法应该是:

def test_upper(self):
with self.assertRaises(TypeError) as cm:
add(3, 'this will raise')
self.assertEqual("Input should be a string:", str(cm.exception), "Input should be a string:")

关于python unittest.TestCase.assertRaises 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39450098/

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