2017-01-09 17 views
2

Учитывая следующий код:Утверждая, что определенная ошибка

def fun(param): 
    if param == 'a': 
     assert False 
    else: 
     return None 

# fun('a') THIS THROWS AN AssertionError 
# PSEUDOCODE FOR WHAT I WANT TO DO: 
# assert (fun('a') throws an AssertionError) 
assert fun('b') == None 

Как я утверждаю, что первый вызов функции (весело («а»)) даст мне AssertionError? Нужно ли мне для этого попробовать, или есть более элегантный способ?

ответ

2

Вы можете использовать pytest для этого:

import pytest 
... 
with pytest.raises(AssertionError): 
    fun('a') 

Это вызовет ошибку, если fun('a')не поднять AssertionError.

Или, если вы используете unittest, и вы находитесь в TestCase, вы можете использовать assert Raises:

self.assertRaises(AssertionError, fun, 'a') 

Кроме того, как и другие ответы уже упоминалось, вы бы лучше raise ИНГ ошибку, чем утверждать, False. И если вы действительно поднимают ошибку, вы можете поднять один, который говорит пользователь больше о что пошло не так, или поднять свое собственное исключение:

import pytest 

class AError(Exception): 
    pass 

def fun(param): 
    if param == 'a': 
     raise AError("You passed 'a'; don't do that!") 
    else: 
     return None 

with pytest.raises(AError): 
    fun('a') 
+0

Это ответил на мой вопрос прекрасно. Я не мог ответить мгновенно, так как был занят. Большое спасибо! – Ohumeronen

1

Метания утверждения, вероятно, лучший подход. В качестве примера:

def fun(param): 
    if param == 'a': 
     raise AssertionError('Param is equal to \'a\'.') 
    else: 
     return None 

try: 
    fun('b') 
    print('Equalling \'b\' worked fine.') 
    fun('a') 
    print('This line is not printed...') 
except AssertionError as err: 
    print('An assertion error has been raised:') 
    print(err) 

дает:

Equalling 'b' worked fine. 
An assertion error has been raised: 
Param is equal to 'a'. 
+0

Спасибо, что указали это мне! – Ohumeronen

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

  • Нет связанных вопросов^_^