2017-08-10 1 views
0

J'essaie d'écrire des tests unitaires pour aws RDS. Actuellement, les appels start stop rds api n'ont pas encore été mis en œuvre en moto. J'ai essayé de me moquer de boto3 mais j'ai rencontré toutes sortes de problèmes bizarres. J'ai fait un peu de googling et trouvé http://botocore.readthedocs.io/en/latest/reference/stubber.htmlaws client boto3 Stubber aide stubbing tests unitaires

J'ai donc essayé d'implémenter l'exemple pour rds mais le code semble se comporter comme le client normal, même si je l'ai écrasé. Vous n'êtes pas sûr de ce qui se passe ou si je bosse correctement?

from LambdaRdsStartStop.lambda_function import lambda_handler 
from LambdaRdsStartStop.lambda_function import AWS_REGION 

def tests_turn_db_on_when_cw_event_matches_tag_value(self, mock_boto): 
    client = boto3.client('rds', AWS_REGION) 
    stubber = Stubber(client) 
    response = {u'DBInstances': [some copy pasted real data here], extra_info_about_call: extra_info} 
    stubber.add_response('describe_db_instances', response, {}) 

    with stubber: 
     r = client.describe_db_instances() 
     lambda_handler({u'AutoStart': u'10:00:00+10:00/mon'}, 'context') 

si les moqueries WORKS pour la première ligne dans la Mitrailleuse et la valeur de r est retourné comme mes données écrasa. Lorsque je tente et aller dans ma méthode de lambda_handler dans mon lambda_function.py et utilise encore le client bouchonné il se comporte comme un client unstubbed normal:

lambda_function.py

def lambda_handler(event, context): 
    rds_client = boto3.client('rds', region_name=AWS_REGION) 
    rds_instances = rds_client.describe_db_instances() 

sortie d'erreur:

File "D:\dev\projects\virtual_envs\rds_sloth\lib\site-packages\botocore\auth.py", line 340, in add_auth 
    raise NoCredentialsError 
NoCredentialsError: Unable to locate credentials 
+0

L'avantage du Stubber sur une maquette typique est qu'il se comporte presque exactement comme un client moins faire un requête http réelle. Vous devrez donc toujours configurer le client avec les informations d'identification et configurer la région, sinon il commettra une erreur. –

+0

Bonjour Jordon, je pense que vous avez peut-être mal lu mon message. La simulation WORKS dans mon test jusqu'à ce que j'essaie d'initialiser le client dans un autre fichier -> lambda_function.py –

+0

Vous ne semblez pas passer le client stubbed à votre gestionnaire lambda. –

Répondre

2

Vous aurez besoin de patcher boto3 où il est appelé dans la routine que vous allez tester. Aussi les réponses Stubber semblent être consommés à chaque appel et sera donc besoin d'une autre add_response pour chaque appel écrasa comme ci-dessous:

def tests_turn_db_on_when_cw_event_matches_tag_value(self, mock_boto): 
    client = boto3.client('rds', AWS_REGION) 
    stubber = Stubber(client) 
    # response data below should match aws documentation otherwise more errors due to botocore error handling 
    response = {u'DBInstances': [{'DBInstanceIdentifier': 'rds_response1'}, {'DBInstanceIdentifierrd': 'rds_response2'}]} 

    stubber.add_response('describe_db_instances', response, {}) 
    stubber.add_response('describe_db_instances', response, {}) 

    with mock.patch('lambda_handler.boto3') as mock_boto3: 
     with stubber: 
      r = client.describe_db_instances() # first_add_response consumed here 
      mock_boto3.client.return_value = client 
      response=lambda_handler({u'AutoStart': u'10:00:00+10:00/mon'}, 'context') # second_add_response would be consumed here 
      # asert.equal(r,response)