#python #mocking #pytest
Вопрос:
Я хочу добавить новую проверку вызова функции в существующий тест
test.py
@pytest.fixture() def get_full_facebook_error_message_mock(mocker): mock = mocker.patch( 'facebook_panel.logic.utils.get_full_facebook_error_message' ) mock.return_value = 'Internal facebook error. ' return mock @pytest.mark.django_db def test_facebook_error_while_create_ad( .... create_ad_mock, get_full_facebook_error_message_mock, ): e = FacebookRequestError( message='Internal facebook error', ...... ) create_ad_mock.side_effect = e get_creatives_to_upload_mock.return_value = [creative] print('START') assert create_pac_dlo_text_ads_task( TEMPLATE_ID, AD_ACCOUNT_ID, ADSET_IDS, PLACEMENTS, LOCALES ) == [ { 'status': FacebookRequestStatus.FAILED, 'errorMessage': get_full_facebook_error_message_mock.return_value, .... }, { 'status': FacebookRequestStatus.FAILED, 'errorMessage': get_full_facebook_error_message_mock.return_value, ..... ] print('END')
function_called_inside_test.py
def create_pac_dlo_text_ads_task(....): ..... for result in results.items: try: create_ad(template_id, ad_account_id, result.ad_set, placements, locales, url) except FacebookRequestError as e: print(' ') result.update( status=FacebookRequestStatus.FAILED, error_message=get_full_facebook_error_message(e),# THIS CALL I EXPECTED code=e.api_error_code(), body=repr(e), ) return results.serialize()
get_full_facebook_error_message
def get_full_facebook_error_message(e: Any) -gt; str: print('Inside get_full_facebook_error_message') details = '' if isinstance(e.body(), dict): details = e.body().get('error', {}).get('error_user_msg', '') return '{}. {}'.format(e.get_message(), details)
Я специально добавил печать ко всем функциям, чтобы вы могли видеть последовательность вызовов. результат теста успешен и выглядит следующим образом
START Inside get_full_facebook_error_message Inside get_full_facebook_error_message END PASSED
Now I’m adding a new check inside test_facebook_error_while_create_ad
test.py
@pytest.mark.django_db def test_facebook_error_while_create_ad( .... create_ad_mock, get_full_facebook_error_message_mock, ): e = FacebookRequestError( message='Internal facebook error', ...... ) create_ad_mock.side_effect = e get_creatives_to_upload_mock.return_value = [creative] print('START') assert create_pac_dlo_text_ads_task( ...... ] get_full_facebook_error_message_mock.assert_called() # lt;-- HERE print('END')
And run test with error
START Inside get_full_facebook_error_message Inside get_full_facebook_error_message FAILED gt; get_full_facebook_error_message_mock.assert_called() E AssertionError: Expected 'get_full_facebook_error_message' to have been called.
Итак, получается, что контекст выполнения программы вводит функцию get_full_facebook_error_message, и это видно на выводе печати («Внутри get_full_facebook_error_message»), но pytest этого не видит. Как это может быть и как я могу исправить тест?