- 此问题在此处已有答案**:
(19个答案)
四年前关闭了。
我做了一个简单的测试:
def setUp(self):
self.testListNone = None
def testListSlicing(self):
self.assertRaises(TypeError, self.testListNone[:1])
我希望测试能通过,但是我遇到了一个异常:
Traceback (most recent call last):
self.assertRaises(TypeError, self.testListNone[:1])
TypeError: 'NoneType' object is unsubscriptable
我以为assertRaises会通过,因为会引发TypeError异常。解释是什么?
4条答案
按热度按时间i7uq4tfw1#
如果你使用的是Python 2.7或更高版本,你可以使用assertRaises作为上下文管理器的功能,并执行以下操作:
如果你使用的是Python 2.6,那么除了目前给出的方法之外,还有一种方法是使用unittest2,它是unittest的新特性到Python 2.6的反向移植,你可以使用上面的代码使它工作。
B:我是unittest的新特性(SkipTest、测试发现等)的忠实粉丝,所以我打算尽可能多地使用unittest2,我建议也这样做,因为它比Python 2.6或更低版本中的unittest有更多的功能。
ih99xse12#
问题是
TypeError
在assertRaises
被调用之前被引发,因为assertRaises
的参数需要在方法被调用之前被求值。你需要传递一个lambda
表达式,如下所示:fykwrbwg3#
使用
assertRaises
的通常方法是调用一个函数:以测试函数调用test_function(args)是否引发TypeError。
self.testListNone[:1]
的问题在于Python在调用assertRaises
方法之前立即对表达式求值,test_function
和args
作为单独的参数传递给self.assertRaises
的全部原因是允许assertRaises
从try...except
块中调用test_function(args)
,从而允许assertRaises
捕捉异常。既然你已经定义了
self.testListNone = None
,并且你需要一个函数来调用,你可以像这样使用operator.itemgetter:因为
self.testListNone[:1]
是一种冗长的说法,但它将函数(operator.itemgetter
)与参数分开。xmq68pz94#
完整的代码片段如下所示,它将mouad的回答扩展为Assert错误消息(或者通常是其参数的字符串表示),这可能会很有用。