我想知道是否有办法做到以下几点:
class Test_Vector_test(unittest.TestCase):
def test_add(self):
vector1 = Vector(2,2,2)
scalar = 1
self.assertRaises(NotImplementedError, vector1+scalar)
此测试失败,出现以下错误代码:
Traceback (most recent call last):
File "/Users/sahandz/Documents/School/Programmeringsteknik och Matlab/dd1315pylab3-master/test/test_Vector.py", line 14, in test_add
self.assertRaises(NotImplementedError, vector1+scalar)
File "/Users/sahandz/Documents/School/Programmeringsteknik och Matlab/dd1315pylab3-master/lab/Vector.py", line 17, in __add__
raise NotImplementedError
NotImplementedError
----------------------------------------------------------------------
Ran 3 tests in 0.007s
FAILED (errors=1)
即使您可以看到它实际上引发了错误。如何使用vector1+scalar
方法获得所需的功能(检查vector1.__add__
是否引发NotImplementedError)没有?
答案 0 :(得分:5)
assertRaises
等待可调用的内容然后会引发错误。 vector1+scalar
评估之前甚至执行函数assertRaises
。使用函数,lambda或with
:
with self.assertRaises(SomeException):
do_something()
答案 1 :(得分:2)
您应该使用callable
类型,而不是实际代码(这会引发错误)。结果将是:
self.assertRaises(NotImplementedError, lambda:vector1+scalar)
答案 2 :(得分:1)
问题是在评估参数时引发NotImplementedError
, assertRaises
实际调用之前。您的代码等同于
x = vector1 + scalar
self.assertRaises(NotImplementedError, x)
您需要将(尝试)呼叫推迟到Vector.__add__
。
self.assertRaises(NotImplementedError, vector1.__add__, scalar)
答案 3 :(得分:1)
感谢您的解决方案。我认为lambda解决方案绝对是最简单,最直观的。
在得到答案之前,这就是我自己提出的问题:
try:
vector1+scalar
result = False
except NotImplementedError:
result = True
self.assertTrue(result, msg="Vector+scalar did not cause the wanted error.")
功能相同,但需要一些额外的行。
答案 4 :(得分:0)
请参阅assertRaises
的文档:
测试在使用任何也传递给assertRaises()的位置或关键字参数调用callable时引发异常。
.selector-options.my-wrapper.selected
不是可调用的,它是一个表达式。