我正在编写一个模块,并使用unittest
在实际代码的同时编写单元测试。在
有时(似乎几乎是不确定的),像下面这样的函数不显式地返回一个用self.assertRaises(mymodule.MyEmptyException, myfunc())
断言的值(其中self
是{DeprecationWarning
。在
下面是这样一个函数的示例:
def insertn(self, items, lidex):
"""( z y x -- z b y x )
add a list of items to the stack at the given index"""
iter(items)
for idx, obj in enumerate(items):
self.insert(lidex, obj)
lidex += 1
相应的单元测试:
^{pr2}$给出(例如):
./mousetesting.py:103: DeprecationWarning: callable is None
我认为使函数具有非None
返回值可能会解决问题(即return 0
),但是我得到了(例如):
======================================================================
ERROR: test_insertn_fail (__main__.CoreStack)
expect failure during multiple insertion
----------------------------------------------------------------------
Traceback (most recent call last):
File "./mousetesting.py", line 103, in test_insertn_fail
stack.insertn([8, 4, 12], 16))
File "/usr/lib/python3.5/unittest/case.py", line 727, in assertRaises
return context.handle('assertRaises', args, kwargs)
File "/usr/lib/python3.5/unittest/case.py", line 176, in handle
callable_obj(*args, **kwargs)
TypeError: 'int' object is not callable
----------------------------------------------------------------------
所以unittest
模块试图调用函数的返回值。。。但不抱怨None
也不是callable
?在
我对Python内部的了解还不够,不足以理解这里发生了什么。我不知道怎样才能避免我的测试中断。在
必须是我的职能(但只是其中的一部分,而不是所有的时间?)返回一个(内存浪费)闭包或无意义的lambda表达式来避免这种情况?或者我应该设计一个东西来检测一个测试是否正在进行,然后才返回一个no-op lambda?为了避免出现DeprecationWarning
,这似乎需要做很多工作。在
您使用
self.assertRaises()
不正确。它必须为您调用测试函数,以便捕捉异常:您正在传递
stack.insertn()
调用的结果(它没有引发异常,而是返回了None
或整数),并且该返回值不可调用。该方法的旧版本也接受了该参数的None
,但不再受支持,因此当传入None
而不是整数时,会发出弃用警告。在更好的方法是使用
^{pr2}$self.assertRaises()
作为上下文管理器:相关问题 更多 >
编程相关推荐