У мене є функція ( foo
), яка викликає іншу функцію ( bar
). Якщо виклик bar()
підвищує показник HttpError
, я хочу його спеціально обробити, якщо код статусу 404, інакше повторно підняти.
Я намагаюсь написати деякі тести одиниць навколо цієї foo
функції, глузуючи з виклику bar()
. На жаль, я не в змозі отримати знущаються дзвінки, щоб bar()
створити Виняток, який потрапив у мій except
блок.
Ось мій код, який ілюструє мою проблему:
import unittest
import mock
from apiclient.errors import HttpError
class FooTests(unittest.TestCase):
@mock.patch('my_tests.bar')
def test_foo_shouldReturnResultOfBar_whenBarSucceeds(self, barMock):
barMock.return_value = True
result = foo()
self.assertTrue(result) # passes
@mock.patch('my_tests.bar')
def test_foo_shouldReturnNone_whenBarRaiseHttpError404(self, barMock):
barMock.side_effect = HttpError(mock.Mock(return_value={'status': 404}), 'not found')
result = foo()
self.assertIsNone(result) # fails, test raises HttpError
@mock.patch('my_tests.bar')
def test_foo_shouldRaiseHttpError_whenBarRaiseHttpErrorNot404(self, barMock):
barMock.side_effect = HttpError(mock.Mock(return_value={'status': 500}), 'error')
with self.assertRaises(HttpError): # passes
foo()
def foo():
try:
result = bar()
return result
except HttpError as error:
if error.resp.status == 404:
print '404 - %s' % error.message
return None
raise
def bar():
raise NotImplementedError()
Я пішов за Mock документів , які говорять , що ви повинні встановити side_effect
з Mock
примірника до Exception
класу мати передражнювати функцію підняти помилку.
Я також переглянув деякі інші пов'язані питання StackOverflow Q & As, і схоже, я роблю те саме, що вони роблять, щоб викликати, а Виняток викликати їх знущання.
- https://stackoverflow.com/a/10310532/346561
- Як за допомогою Python Mock збільшити виняток, але Errno встановлено на задане значення
Чому встановивши side_effect
з barMock
не викликає очікуваний Exception
бути підняті? Якщо я роблю щось дивне, як я повинен перейти до тестування логіки в своєму except
блоці?
HttpError
- це клас, визначений у lib Google,apiclient
який ми використовуємо в GAE. Це __init__
визначено парамами, (resp, content)
тому я намагався створити екземпляр макети для відповіді із вказаним відповідним кодом статусу.
HttpError
і замість цього спробував використовувати лише звичайний Exception
екземпляр. Це прекрасно працює. Це означає, що він повинен мати щось спільне з тим, як я конфігурую HttpError
екземпляр, ймовірно, пов’язаний із тим, як я створюю Mock
екземпляр для відповіді.
resp.status
код. Звідки беретьсяHTTPError
?