2016-10-21 1 views
0

Je suis en train de test unitaire fonction:Comment puis-je simuler un appel de boto3 sns dans les tests unitaires?

@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 

Lorsque les utilisateurs enregistrent pour notre service, ils obtiennent un sujet arn en fonction de leur type d'appareil.

J'ai essayé:

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) 

Où self.user est un utilisateur enregistré dans la méthode de mise en place de TestCase. Cela échoue, le call_count est 0

Je me gratte la tête en essayant de trouver un moyen de tester cette fonction, mais la plupart du temps à venir avec des modules tiers ou des exemples pour S3.

Toute aide est appréciée

Répondre

1

Vous devez moquerie où il est importé (à moins qu'il est une méthode de classe)

Donc, si votre fonction push_notification est dans un module appelé mon_module, vous devez écrire:

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