2016-11-22 4 views
2

У меня возникли проблемы воспитывающей исключения из функции в моем тесте:Python, макет: повышение исключения

### Implemetation 
def MethodToTest(): 
    myVar = StdObject() 
    try: 
     myVar.raiseError() # <--- here 
     return True 
    except Exception as e: 
     # ... code to test 
     return False 

### Test file 
@patch('stdLib.StdObject', autospec=True) 
def test_MethodeToTest(self, mockedObjectConstructor): 
    mockedObj = mockedObjectConstructor.return_value 
    mockedObj.raiseError.side_effect = Exception('Test') # <--- do not work 
    ret = MethodToTest() 
    assert ret is False 

Я хотел бы raiseError() функцию, чтобы вызвать ошибку.

Я нашел несколько примеров на SO, но ни один из них не соответствовал моей потребности.

+0

может быть, это может помочь вам http://stackoverflow.com/questions/2052390/вручную-raise-throwing-the-exception-in-python –

+1

Вы уверены, что исправляете нужное место (где оно импортировано, а не там, где оно было импортировано * из *)? – jonrsharpe

+0

Я _think_, что я исправляю в нужном месте, так как мои другие тесты работают так, как ожидалось. – user4780495

ответ

1

I chanched

@patch('stdLib.StdObject', autospec=True) 

в

@patch('stdLib.StdObject', **{'return_value.raiseError.side_effect': Exception()}) 

и удалил # <--- do not work линию.

Сейчас он работает.

This - хороший пример.

EDIT:

mockedObj.raiseError.side_effect = Mock(side_effect=Exception('Test')) 

также работает.

2

Ok, ваш ответ вы предоставили правильный, но вы изменили, как вы это сделали (это хорошо, чтобы исправить исходную проблему, необходимо назначить функцию side_effect, а не результаты или объект:.

def my_side_effect(): 
    raise Exception("Test") 

@patch('stdLib.StdObject', autospec=True) 
def test_MethodeToTest(self, mockedObjectConstructor): 
    mockedObj = mockedObjectConstructor.return_value 
    mockedObj.raiseError.side_effect = my_side_effect # <- note no brackets, 
    ret = MethodToTest() 
    assert ret is False 

Надежда, что помогает. Обратите внимание, если целевой метод принимает арг, побочный эффект должен принять арг, а также (я верю).

+0

Вам не нужно назначать функцию; это только один из вариантов, но здесь это не самое лучшее. Просто назначьте исключение 'side_effect' вместо:' mockedObj.raiseError.side_effect = Исключение («Тест») '. –

+0

Вам не нужно ничего: и его редактирование имеет третий способ сделать это, когда он создает макет с установленным побочным эффектом, но его по-прежнему является действительным и хорошим, чтобы знать, как это сделать при тестировании. Нет ничего плохого в том, чтобы делать это таким образом, тем более, что он позволяет вам продлить тест позже? – Jmons