예외 블록을 테스트하기 위해 예외를 발생시키는 함수 조롱
나는 기능이 있습니다).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도 살펴보았는데, 저는 그들이 그들의 조롱에 의해 예외가 제기되도록 그들이 하고 있는 것과 같은 일을 하고 있는 것처럼 보입니다.
- https://stackoverflow.com/a/10310532/346561
- Python Mock을 사용하여 예외를 발생시키는 방법 - 그러나 Errno가 지정된 값으로 설정된 경우
설정하는 이유side_effect의barMock예상치 못한 원인이 되는Exception길러질까요?만약 내가 이상한 일을 하고 있다면, 나는 어떻게 논리를 테스트해야 합니까?except블록?
당신의 조롱은 예외를 제기하고 있지만, 그것은 괜찮습니다.error.resp.status값이 없습니다.사용하기 보다는return_value말뿐인Mock그거status는 속성입니다.
barMock.side_effect = HttpError(mock.Mock(status=404), 'not found')
추가 키워드 인수:Mock()결과 개체에 대한 속성으로 설정됩니다.
당신의foo그리고.bar의 정의my_tests모듈, 나도 사용할 수 있도록 클래스에 추가하면 테스트를 성공적으로 실행할 수 있습니다.
>>> from my_tests import foo, HttpError
>>> import mock
>>> with mock.patch('my_tests.bar') as barMock:
... barMock.side_effect = HttpError(mock.Mock(status=404), 'not found')
... result = my_test.foo()
...
404 -
>>> result is None
True
당신은 심지어 볼 수 있습니다.print '404 - %s' % error.message라인 런, 하지만 당신은 사용하고 싶었던 것 같아요.error.content대신 거기; 그것이 속성입니다.HttpError()두 번째 인수의 집합입니다.
언급URL : https://stackoverflow.com/questions/28305406/mocking-a-function-to-raise-an-exception-to-test-an-except-block
'codememo' 카테고리의 다른 글
| Typescript의 as const에 해당하는 JSDoc? (0) | 2023.06.12 |
|---|---|
| Oracle에서 쉼표로 구분된 값을 열로 분할 (0) | 2023.06.12 |
| Python에서 xlrd를 사용하여 숫자 Excel 데이터를 텍스트로 읽기 (0) | 2023.06.07 |
| Java와 Oracle XE 간의 데이터 소스 연결을 사용하는 OCI와 SIN 드라이버 연결의 차이점은 무엇입니까? (0) | 2023.06.07 |
| 추상 클래스 유형 스크립트에 종속성 주입(Angular2) (0) | 2023.06.07 |