내가 함수 (이 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()
나는 다음 모의 문서 는 설정해야합니다 말 side_effect
의 Mock
에 인스턴스를 Exception
조롱 기능 인상을 오류를 가지고 클래스를.
나는 또한 다른 관련 StackOverflow Q & A를 살펴 보았고, 그들이 모의에 의해 발생하는 예외와 똑같은 일을하고있는 것처럼 보입니다.
왜 설정되어 side_effect
의 barMock
예상 원인이되지 Exception
제기 할 수는? 내가 이상한 일을하고 있다면 내 except
블록 에서 로직 테스트를 어떻게해야 합니까?
HttpError
는 GAE에서 사용하는 Google의 apiclient
lib에 정의 된 클래스 입니다. 그것은 것 __init__
params 객체를 파라미터로 정의 (resp, content)
내가 응답을 모의 인스턴스를 만들려고 그래서 적절한 상태 코드를 지정하여,.
HttpError
시도하고 대신 일반 Exception
인스턴스 를 사용해 보았습니다 . 이것은 완벽하게 작동합니다. 즉 , 응답을위한 인스턴스를 HttpError
만드는 방법과 관련 하여 인스턴스를 구성하는 방법과 관련이 있어야합니다 Mock
.
resp.status
코드를 어떻게 설정하는지 잘 모르겠습니다 . 어디HTTPError
에서 왔습니까?