pytest не улавливает вызовы функций

#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 этого не видит. Как это может быть и как я могу исправить тест?