2017-08-10 1 views
0

Ich versuche, einige Komponententests für AWS RDS zu schreiben. Derzeit sind die Start-Stopp-Rds-API-Aufrufe in moto noch nicht implementiert. Ich habe nur versucht, Boto3 zu verspotten, aber ich hatte alle möglichen seltsamen Probleme. Ich habe etwas googeln und gefunden http://botocore.readthedocs.io/en/latest/reference/stubber.htmlaws boto3 client Stubber Hilfe Stubbing Unit Tests

So habe ich versucht, das Beispiel für RDS zu implementieren, aber der Code verhält sich wie der normale Client, obwohl ich es stubbed. Nicht sicher, was los ist oder ob ich richtig stoße?

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') 

so arbeitet, um die spöttische für die erste Zeile in dem Stubber und der Wert von r wird als meine stubbed Daten zurückgegeben. Wenn ich versuche, und in meine lambda_handler Methode in meinem lambda_function.py gehen und immer noch den Stub-Client verwenden Sie es wie ein normales unstubbed Client verhält:

lambda_function.py

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

Fehlerausgang:

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

Der Vorteil der Glutabstreifer über eine typische Mock ist, dass es fast genau wie ein Client verhält minus Herstellung einer tatsächliche http-Anfrage. Also müssen Sie den Client noch mit Anmeldeinformationen einrichten und die Region konfigurieren oder es wird so ein Fehler auftreten. –

+0

Hallo Jordon, ich denke du hast meinen Beitrag falsch gelesen. Das Mocking ARBEITET in meinem Test, bis ich versuche, den Client in einer anderen Datei zu initialisieren -> lambda_function.py –

+0

Sie scheinen den stubbed-Client nicht an Ihren Lambda-Handler zu übergeben. –

Antwort

2

Sie müssen boto3 dort patchen, wo es in der Routine aufgerufen wird, die Sie testen werden. Auch erscheinen Stubber Antworten bei jedem Aufruf verbraucht werden und somit wird eine weitere add_response für jeden stubbed Aufruf erfordern, wie unten:

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)