2016-10-21 16 views
0

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

@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 

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

Я попытался:

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