python 如何正确使用NoneType对象的单元测试assertRaises()[duplicate]

67up9zun  于 2023-01-08  发布在  Python
关注(0)|答案(4)|浏览(148)
    • 此问题在此处已有答案**:

(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异常。解释是什么?

i7uq4tfw

i7uq4tfw1#

如果你使用的是Python 2.7或更高版本,你可以使用assertRaises作为上下文管理器的功能,并执行以下操作:

with self.assertRaises(TypeError):
    self.testListNone[:1]

如果你使用的是Python 2.6,那么除了目前给出的方法之外,还有一种方法是使用unittest2,它是unittest的新特性到Python 2.6的反向移植,你可以使用上面的代码使它工作。
B:我是unittest的新特性(SkipTest、测试发现等)的忠实粉丝,所以我打算尽可能多地使用unittest2,我建议也这样做,因为它比Python 2.6或更低版本中的unittest有更多的功能。

ih99xse1

ih99xse12#

问题是TypeErrorassertRaises被调用之前被引发,因为assertRaises的参数需要在方法被调用之前被求值。你需要传递一个lambda表达式,如下所示:

self.assertRaises(TypeError, lambda: self.testListNone[:1])
fykwrbwg

fykwrbwg3#

使用assertRaises的通常方法是调用一个函数:

self.assertRaises(TypeError, test_function, args)

以测试函数调用test_function(args)是否引发TypeError。
self.testListNone[:1]的问题在于Python在调用assertRaises方法之前立即对表达式求值,test_functionargs作为单独的参数传递给self.assertRaises的全部原因是允许assertRaisestry...except块中调用test_function(args),从而允许assertRaises捕捉异常。
既然你已经定义了self.testListNone = None,并且你需要一个函数来调用,你可以像这样使用operator.itemgetter:

import operator
self.assertRaises(TypeError, operator.itemgetter, (self.testListNone,slice(None,1)))

因为

operator.itemgetter(self.testListNone,slice(None,1))

self.testListNone[:1]是一种冗长的说法,但它将函数(operator.itemgetter)与参数分开。

xmq68pz9

xmq68pz94#

完整的代码片段如下所示,它将mouad的回答扩展为Assert错误消息(或者通常是其参数的字符串表示),这可能会很有用。

from unittest import TestCase

class TestNoneTypeError(TestCase):

  def setUp(self):
    self.testListNone = None

  def testListSlicing(self):
    with self.assertRaises(TypeError) as ctx:
        self.testListNone[:1]
    self.assertEqual("'NoneType' object is not subscriptable", str(ctx.exception))

相关问题