Как я могу имитировать вызов boto3 sns в модульных тестах?

#django #unit-testing #amazon-sns #boto3

#django #модульное тестирование #amazon-sns #boto3

Вопрос:

Я пытаюсь модульно протестировать функцию:

 @shared_task()
def push_notification(message=None, message_type=None, user_id=None, data={}):

    #  Get the aws arn from token table
    aws_token_data = AwsDeviceToken.objects.filter(user_id=user_id).latest("id")
    client = boto3.client('sns', **aws.AWS_CREDENTIAL)

    message = {
        'default': message,
         more stuff here 
         'data': data})
    }
    message = json.dumps(message, ensure_ascii=False)
    response = client.publish(
        TargetArn=str(aws_token_data.aws_PLATFORM_endpoint_arn),
        Message=message,
        MessageStructure='json',
        MessageAttributes={}
    )
    return response
  

Когда пользователи регистрируются в нашем сервисе, они получают arn темы в зависимости от типа их устройства.

Я пытался:

 def test_push_notification(self):
    with mock.patch('boto3.client') as mock_client:
        data = {'Some data': "to be sent"}
        push_notification(
            message="your invitation has been accepted",
            message_type='b2g_accepted',
            user=self.user,
            data=data
        )
        self.assertEqual(mock_client.call_count, 1)
  

Где self.user — это пользователь, зарегистрированный в методе настройки TestCase. Это не удается, call_count равен 0

Я ломаю голову, пытаясь найти способ протестировать эту функцию, но в основном придумываю сторонние модули или примеры для S3.

Приветствуется любая помощь

Ответ №1:

Вам нужно смоделировать, куда он импортирован (если это не метод класса)

Итак, если ваша функция push_notification находится в модуле с именем my_module, вы должны написать:

 With mock.patch('my_module.boto3.client') as mock_client
  

Комментарии:

1. Как имитировать фактический publish ?