Невозможно протестировать пользовательские исключения ⇐ Python
-
Гость
Невозможно протестировать пользовательские исключения
Существует класс PostRecommendationsFuction, который возвращает некоторые рекомендации в виде HttpResponse. В этом классе также есть custom_Exceptions, которые вызывают custom_Exceptions родительского класса SearchHttpFunctionBase. Я пишу тестовый пример, который имитирует custom_Exceptions.
из azure.core.Exceptions import HttpResponseError из azure.functions импортировать HttpResponse класс PostRecommendationsFunction(SearchHttpFunctionBase): процесс защиты (сам): return HttpResponse(body=recommendations.json(by_alias=True, ignore_unset=True), headers={'Content-Type': 'application/json'}) def custom_Exceptions(self) -> dict[Type[Exception], Callable[[Exception], HttpResponse]]: вернуть супер().custom_Exceptions() класс SearchHttpFunctionBase(): def custom_Exceptions(self) -> dict[Type[Exception], Callable[[Exception], HttpResponse]]: return {HttpResponseError: лямбда e: HttpResponse(status_code=e.status_code, message=e.message)} Ниже приведены тестовые примеры. Функция test_fx_post_recommendations_returns_error — это то место, где у меня возникают проблемы с получением соответствующей ошибки. Функция test_fx_post_recommendations_returns_200 работает должным образом. Что мне не хватает?
@pytest.fixture defock_recommendations(mocker: MockerFixture, test_search_docs: List[SearchResult]) -> SearchResultList: ock_recommendations_service = mocker.patch( 'fx_post_recommendations.post_recommendations.RecommendationsViewService') макетный_номер = '1001' ock_recommendations = SearchResultList(target_numbers=[mock_number], search_results=test_search_docs) экземпляр = MagicMock (RecommendationsViewService) экземпляр.get_recommendations.return_value = макет_рекомендации ock_recommendations_service.return_value = экземпляр вернуть макет_рекомендации @pytest.fixture defock_Exception(mocker: MockerFixture) -> MagicMock: ock_recommendations_service = mocker.patch( 'fx_post_recommendations.post_recommendations.RecommendationsViewService') экземпляр = MagicMock (RecommendationsViewService) экземпляр.get_recommendations.side_effect = HttpResponseError('ResourceNotFoundError') экземпляр.исключения = HttpResponseError('ResourceNotFoundError') # экземпляр.side_effect = HttpResponseError('Ошибка') ock_recommendations_service.return_value = экземпляр макет_исключение = экземпляр # ожидаемый_ответ = HttpResponse # return HttpResponse('ResourceNotFoundError', status_code=404) вернуть макет_исключение def test_fx_post_recommendations_returns_200 (mock_recommendations: SearchResultList): # ДАННЫЙ запрос = HttpRequest (метод = 'POST', URL='recs/{number}', маршрут_парамс = {'номер':ock_recommendations.target_numbers[0]}, body=json.dumps({ 'идентификатор пользователя': '123' }).encode('utf-8')) ожидаемый_ответ = макет_рекомендации # КОГДА get_recommendation_function: PostRecommendationsFunction = PostRecommendationsFunction( mtls_enabled = False, incoming_mtls_authenticator = MagicMock ()) ответ: HttpResponse = get_recommendation_function.process(req=request, context=MagicMock()) # ЗАТЕМ утверждать ответ.status_code == 200 утвердить ответ.get_body().decode('utf-8') == ожидаемый_ответ.json(by_alias=True, ignore_unset=True) защита test_fx_post_recommendations_returns_error (mock_Exception): с pytest.raises(HttpResponseError): # с патчем('fx_post_recommendations.post_recommendations.RecommendationsViewService' # ) как макет_объекта: #ock_obj.side_effect = HttpResponseError('Ошибка') # ДАННЫЙ макетный_номер = '1001' запрос = HttpRequest (метод = 'POST', URL='recs/{number}', маршрут_парамс = {'номер': макет_номер}, body=json.dumps({ 'идентификатор пользователя': '123' }).encode('utf-8')) ожидаемый_ответ = макетное_исключение # КОГДА get_recommendation_function: PostRecommendationsFunction = PostRecommendationsFunction( mtls_enabled = False, incoming_mtls_authenticator = MagicMock ()) ответ: HttpResponse = get_recommendation_function.process(req=request, context=MagicMock()) # ЗАТЕМ # mock_obj.assert_known_once() утверждать ответ.status_code == 200 утвердить ответ.get_body().decode('utf-8') == ожидаемый_ответ.json(by_alias=True, ignore_unset=True)
Существует класс PostRecommendationsFuction, который возвращает некоторые рекомендации в виде HttpResponse. В этом классе также есть custom_Exceptions, которые вызывают custom_Exceptions родительского класса SearchHttpFunctionBase. Я пишу тестовый пример, который имитирует custom_Exceptions.
из azure.core.Exceptions import HttpResponseError из azure.functions импортировать HttpResponse класс PostRecommendationsFunction(SearchHttpFunctionBase): процесс защиты (сам): return HttpResponse(body=recommendations.json(by_alias=True, ignore_unset=True), headers={'Content-Type': 'application/json'}) def custom_Exceptions(self) -> dict[Type[Exception], Callable[[Exception], HttpResponse]]: вернуть супер().custom_Exceptions() класс SearchHttpFunctionBase(): def custom_Exceptions(self) -> dict[Type[Exception], Callable[[Exception], HttpResponse]]: return {HttpResponseError: лямбда e: HttpResponse(status_code=e.status_code, message=e.message)} Ниже приведены тестовые примеры. Функция test_fx_post_recommendations_returns_error — это то место, где у меня возникают проблемы с получением соответствующей ошибки. Функция test_fx_post_recommendations_returns_200 работает должным образом. Что мне не хватает?
@pytest.fixture defock_recommendations(mocker: MockerFixture, test_search_docs: List[SearchResult]) -> SearchResultList: ock_recommendations_service = mocker.patch( 'fx_post_recommendations.post_recommendations.RecommendationsViewService') макетный_номер = '1001' ock_recommendations = SearchResultList(target_numbers=[mock_number], search_results=test_search_docs) экземпляр = MagicMock (RecommendationsViewService) экземпляр.get_recommendations.return_value = макет_рекомендации ock_recommendations_service.return_value = экземпляр вернуть макет_рекомендации @pytest.fixture defock_Exception(mocker: MockerFixture) -> MagicMock: ock_recommendations_service = mocker.patch( 'fx_post_recommendations.post_recommendations.RecommendationsViewService') экземпляр = MagicMock (RecommendationsViewService) экземпляр.get_recommendations.side_effect = HttpResponseError('ResourceNotFoundError') экземпляр.исключения = HttpResponseError('ResourceNotFoundError') # экземпляр.side_effect = HttpResponseError('Ошибка') ock_recommendations_service.return_value = экземпляр макет_исключение = экземпляр # ожидаемый_ответ = HttpResponse # return HttpResponse('ResourceNotFoundError', status_code=404) вернуть макет_исключение def test_fx_post_recommendations_returns_200 (mock_recommendations: SearchResultList): # ДАННЫЙ запрос = HttpRequest (метод = 'POST', URL='recs/{number}', маршрут_парамс = {'номер':ock_recommendations.target_numbers[0]}, body=json.dumps({ 'идентификатор пользователя': '123' }).encode('utf-8')) ожидаемый_ответ = макет_рекомендации # КОГДА get_recommendation_function: PostRecommendationsFunction = PostRecommendationsFunction( mtls_enabled = False, incoming_mtls_authenticator = MagicMock ()) ответ: HttpResponse = get_recommendation_function.process(req=request, context=MagicMock()) # ЗАТЕМ утверждать ответ.status_code == 200 утвердить ответ.get_body().decode('utf-8') == ожидаемый_ответ.json(by_alias=True, ignore_unset=True) защита test_fx_post_recommendations_returns_error (mock_Exception): с pytest.raises(HttpResponseError): # с патчем('fx_post_recommendations.post_recommendations.RecommendationsViewService' # ) как макет_объекта: #ock_obj.side_effect = HttpResponseError('Ошибка') # ДАННЫЙ макетный_номер = '1001' запрос = HttpRequest (метод = 'POST', URL='recs/{number}', маршрут_парамс = {'номер': макет_номер}, body=json.dumps({ 'идентификатор пользователя': '123' }).encode('utf-8')) ожидаемый_ответ = макетное_исключение # КОГДА get_recommendation_function: PostRecommendationsFunction = PostRecommendationsFunction( mtls_enabled = False, incoming_mtls_authenticator = MagicMock ()) ответ: HttpResponse = get_recommendation_function.process(req=request, context=MagicMock()) # ЗАТЕМ # mock_obj.assert_known_once() утверждать ответ.status_code == 200 утвердить ответ.get_body().decode('utf-8') == ожидаемый_ответ.json(by_alias=True, ignore_unset=True)
Мобильная версия