Python Unittest - assertRaises的意外用法?

时间:2016-02-16 15:41:23

标签: python

我想知道是否有办法做到以下几点:

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)没有

5 个答案:

答案 0 :(得分:5)

assertRaises等待可调用的内容然后会引发错误。 vector1+scalar评估之前甚至执行函数assertRaises。使用函数,lambda或with

with self.assertRaises(SomeException):
    do_something()

另见the documentation

答案 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不是可调用的,它是一个表达式。