2016-02-16 2 views
1

Интересно, если есть способ сделать следующее:Python Unittest - Непреднамеренное использование для assertRaises?

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 вызывает NotImplementedError) без с использованием метода vector1.__add__?

+0

Вы читали [документацию] (https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertRaises), чтобы знать, как использовать 'assertRaises'? –

ответ

4

assertRaises что-то вызываемое что тогда поднимет ошибку ждет. vector1+scalar оценивается до функция assertRaises даже выполнена. Либо использовать функцию, лямбда или with:

with self.assertRaises(SomeException): 
    do_something() 

Смотрите также the documentation.

+0

это сработало для меня, хотя я видел такое же поведение, как и op, даже когда передал вызываемый код, который вызывает 'NotImplementedError'' assertRaises'. Я тестировал в контексте функции проверки, которую я написал. Weird. –

+0

@JasonWolosonovich Вы уверены, что при построении аргументов ошибка не была выбрана? 'def r(): повысить значение NotImplementedError; assertRaises (NotImplementedError, r) 'работает так, как ожидалось для меня. – syntonym

+0

На самом деле, я понял, почему отсюда: https://stackoverflow.com/questions/12516881/assertraises-fails-even-the-callable-raises-the-required-exception-python-uni Я звонил потому что мне пришлось передавать ключевые слова, в которых мне понадобился менеджер контекста 'with' в моем случае. –

2

Вы должны использовать тип callable, а не действительный код (что вызывает ошибку). Результат будет таким:

self.assertRaises(NotImplementedError, lambda:vector1+scalar) 
1

Проблема заключается в том, что NotImplementedError возникает в то время как аргумент оценивается, перед темassertRaises на самом деле называется. Ваш код эквивалентен

x = vector1 + scalar 
self.assertRaises(NotImplementedError, x) 

Вам нужно отложить (попытку) вызов Vector.__add__.

self.assertRaises(NotImplementedError, vector1.__add__, scalar) 
0

Смотрите документацию assertRaises:

испытание, что исключение возникают, когда вызываемый вызываются с любыми позиционными или именованными аргументами, которые также прошли в assertRaises().

vector1+scalar не является вызываемым, это выражение.

1

Спасибо за ваши решения. Я думаю, что решение лямбда было, безусловно, самым простым и интуитивным.

Перед тем, как ваши ответы, вот что я придумал себе:

try: 
     vector1+scalar 
     result = False 
    except NotImplementedError: 
     result = True 
    self.assertTrue(result, msg="Vector+scalar did not cause the wanted error.") 

Функциональность та же, но некоторые дополнительные линии не требуется.

Смежные вопросы