And*_*usa 154 python unit-testing
我做了一个简单的测试用例:
def setUp(self):
self.testListNone = None
def testListSlicing(self):
self.assertRaises(TypeError, self.testListNone[:1])
Run Code Online (Sandbox Code Playgroud)
我期待测试通过,但我得到例外:
Traceback (most recent call last):
self.assertRaises(TypeError, self.testListNone[:1])
TypeError: 'NoneType' object is unsubscriptable
Run Code Online (Sandbox Code Playgroud)
我认为assertRaises会通过,因为会引发TypeError异常?
mou*_*uad 235
如果您使用的是python2.7或更高版本,则可以使用assertRaises作为上下文管理器的功能,并执行以下操作:
with self.assertRaises(TypeError):
self.testListNone[:1]
Run Code Online (Sandbox Code Playgroud)
如果你使用python2.6,那么除了现在使用的另一种方法是使用unittest2,这是python2.6的unittest新功能的后端,你可以使用上面的代码使它工作.
注意:我是unittest的新功能(SkipTest,测试发现......)的忠实粉丝所以我打算尽可能多地使用unittest2.我建议做同样的事情,因为在python2.6中有比单元测试更多的东西.
Bas*_*ink 126
问题是TypeError
被提出"之前" assertRaises
被调用,因为该参数assertRaises
需要进行评估,可以调用该方法之前.你需要传递一个lambda
表达式:
self.assertRaises(TypeError, lambda: self.testListNone[:1])
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 80
通常的使用方法assertRaises
是调用函数:
self.assertRaises(TypeError, test_function, args)
Run Code Online (Sandbox Code Playgroud)
测试函数调用test_function(args)引发TypeError.
问题self.testListNone[:1]
是Python在assertRaises
调用方法之前立即评估表达式.将test_function
和args
作为单独的参数传递的全部原因self.assertRaises
是允许从块内assertRaises
调用,允许捕获异常.test_function(args)
try...except
assertRaises
既然你已经定义了self.testListNone = None
,并且你需要一个函数来调用,你可以像这样使用operator.itemgetter:
import operator
self.assertRaises(TypeError, operator.itemgetter, (self.testListNone,slice(None,1)))
Run Code Online (Sandbox Code Playgroud)
以来
operator.itemgetter(self.testListNone,slice(None,1))
Run Code Online (Sandbox Code Playgroud)
是一种冗长的说法self.testListNone[:1]
,但它将函数(operator.itemgetter
)与参数分开.
完整的代码段如下所示。它扩展了@mouad对错误消息(或通常str
表示错误消息)的断言的答案args
,这可能很有用。
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))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
96138 次 |
最近记录: |