codememo

예외 블록을 테스트하기 위해 예외를 발생시키는 함수 조롱

tipmemo 2023. 6. 12. 21:30
반응형

예외 블록을 테스트하기 위해 예외를 발생시키는 함수 조롱

나는 기능이 있습니다).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_effectbarMock예상치 못한 원인이 되는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

반응형