2017-08-10 19 views
0

私はaws RDSのためのいくつかのユニットテストを書こうとしています。現在のところ、rds api呼び出しの開始ストップはまだモトで実装されていません。私はboto3を嘲笑しようとしましたが、あらゆる種類の奇妙な問題に遭遇しました。私はいくつかのグーグルして見つけたhttp://botocore.readthedocs.io/en/latest/reference/stubber.htmlaws boto3クライアントStubberヘルプスタブユニットテスト

私はrdsの例を実装しようとしましたが、コードは通常のクライアントのように振る舞っているように見えますが、スタブしています。何が起きているのか、私が正しくスタブしているのかどうか分からないのですか?

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

のでモックはstubber内の最初の行のために動作し、Rの値は、私のスタブデータとして返されます。私が試してみて、私のlambda_function.py内部の私のlambda_handlerメソッドに行くと、まだスタブクライアントを使用する場合には、通常のunstubbedクライアントのように動作します:

lambda_function.py

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

エラー出力:

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

典型的なモックを超えるstubberの利点を、それがほぼ正確にクライアントマイナス作るように振る舞うということです実際のHTTPリクエストしたがって、依然として資格情報を使用してクライアントを設定し、地域を設定する必要があります。そうしないと、エラーが発生します。 –

+0

こんにちはジョーダン、私はあなたが私のポストを誤解しているかもしれないと思います。クライアントが別のファイルで初期化しようとするまで私のテストでmocking WORKSを実行する - > lambda_function.py –

+0

スタブ付きクライアントをラムダハンドラに渡しているようには見えません。 –

答えて

2

テストするルーチンで呼び出されるboto3にパッチを適用する必要があります。またStubber応答は、各コールで消費されるように思われるので、以下のように各スタブ呼び出しのための別のadd_response必要になります。

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) 
関連する問題