Python unittest 断言引发错误



我在Python中运行unittest时遇到了这个奇怪的麻烦: 我使用了断言,运行 unittest 引发了正确的异常,但测试仍然失败。 好吧,我真的无法解释它,请自己查看回溯:

Error
Traceback (most recent call last):
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/Part1and4Test.py", line 32, in test_non_alpha_name
self.assertRaises(RestNameContainNonAlphaError, RestaurantName(self.non_alpha_name))
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/InputCheck.py", line 29, in __init__
raise RestNameContainNonAlphaError('There are non alphabetic characters that I can not recognize!')
RestNameContainNonAlphaError: There are non alphabetic characters that I can not recognize!

Error
Traceback (most recent call last):
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/Part1and4Test.py", line 24, in test_non_string_name
self.assertRaises(InputNotStringError, RestaurantName, self.non_string_name)
File "/Users/chianti/anaconda/lib/python2.7/unittest/case.py", line 473, in assertRaises
callableObj(*args, **kwargs)
File "/Users/chianti/PycharmProjects/Programming_Project/Part1and4/InputCheck.py", line 33, in __init__
raise InputNotStringError('Not String! The input is supposed to be a string type!')
InputNotStringError: Not String! The input is supposed to be a string type!

为什么??????????任何想法都值得赞赏!!谢谢


这是我的单元测试:

class RestaurantNameTests(unittest.TestCase):
def setUp(self):
    self.non_string_name = 123
    self.valid_name = 'Italian rest '
    self.non_alpha_name = 'valid ** n'
def tearDown(self):
    self.non_string_name = None
    self.valid_name = None
    self.non_alpha_name = None
def test_non_string_name(self):
    with self.assertRaises(InputNotStringError):
        RestaurantName(self.non_string_name)
def test_valid_name(self):
    self.assertEqual(RestaurantName(self.valid_name).__str__(), 'Italian rest')
def test_non_alpha_name(self):
    self.assertRaises(RestNameContainNonAlphaError, RestaurantName(self.non_alpha_name))

如果您需要查看餐厅名称的定义,这里是:

class RestaurantName():
def __init__(self, input_contents):
    self.name = input_contents
    if IsValidString(self.name):
        self.no_space_name = self.name.replace(' ', '')
        if str.isalpha(self.no_space_name):
            pass
        else:
            raise RestNameContainNonAlphaError('There are non alphabetic characters that I can not recognize!')
    else:
        raise InputNotStringError('Not String! The input is supposed to be a string type!')
def __repr__(self):
    return 'RestaurantName(%s)' % self.name.strip()  
def __str__(self):
    return self.name.strip() 

再次感谢

回溯与您对问题的描述(也与您的代码 FWIW 不匹配)。您收到的错误是您没有发布的test_non_alpha_name(),但错误消息如下所示:

self.assertRaises(
    RestNameContainNonAlphaError, 
    RestaurantName(self.non_alpha_name)
    )

这不是使用assertRaises()的正确方法。您必须将ExpectedExceptionClass, callable, *args, **kw传递给assertRaises,并且argskw将传递给您的可调用对象。您想要的欠条:

self.assertRaises(
    RestNameContainNonAlphaError, 
    RestaurantName, 
    self.non_alpha_name
    )

原因很简单:您当前调用它的方式,异常是在调用 assertRaises 之前触发的。

作为旁注:

  • 你的拆解方法没用
  • 错误类型已经有一个内置异常,它被命名为 TypeError
  • 还有一个
  • 用于错误值的内置异常
  • ,名为 ValueError

最新更新