2016-04-14 31 views
5

私は特定のboto3関数をモックしようとしています。私のモジュールCleanupは、boto3をインポートします。クリーンアップには、クラス「クリーナー」もあります。初期化時には、クリーナーは、EC2クライアントを作成します。boto3クライアントオブジェクト/コールをモックする方法

self.ec2_client = boto3.client('ec2') 

私はEC2クライアントのメソッドをモックとしたい:

<bound method EC2.describe_tags of <botocore.client.EC2 object at 0x7fd98660add0>> 

私が得ている遠いがbotocoreをインポートされます:pythonがあると言うdesribe_tagsを()、

mock.patch(Cleaner.botocore.client.EC2.describe_tags) 

で失敗します:

AttributeError: 'module' object has no attribute 'EC2' 
私のテストファイルと試みることに

この方法をどうやって模擬しますか?

import boto3 
class cleaner(object): 
    def __init__(self): 
     self.ec2_client = boto3.client('ec2') 

ec2_clientオブジェクトがdesribe_tags()メソッドを有するものである。よう

クリーンに見えます。これはbotocore.client.EC2オブジェクトですが、ボトコアを直接インポートすることはありません。

+0

に役立ちます願っています。あなたはそれを使用するためにEC2をいかに正確にインポートしていますか?その外観から 'import boto3'のようなことをしています。右?ですから、あなたのパッチは 'Cleanup.boto3.EC2'のようなものでなければならないと思います。あなたのモジュールに 'Cleanup'という名前を付けた場合。確かな情報があれば助かります。 – idjaw

+0

モジュールのサンプルを追加 –

+0

@JeffTang解決策を見つけましたか?私は似たようなものを探しています! – ptimson

答えて

0

あなたがの場合は、は、あなたがテストしている場所に関して嘲笑してください。したがって、cleanerクラス(ここではPEP8標準を使用して、それをCleanerとすることをお勧めします)をテストしている場合は、テストする場所を疑似したいと思います。私はあなたが私はこれに解決策を見つけ

+0

私は 'boto3.client'をモックしようとしていません。私は、 'bototo.client.EC2'オブジェクトの' describe_tags'メソッドを模倣しようとしています。これは 'boto3.client'によって返されます。 –

+0

あなたはまだEC2の作業クライアントをインスタンス化していますが、あなたが作成するオブジェクトからのメソッド?通常、単体テストや模擬パッチを適用している場合、そのEC2クライアントのような外観を模倣したいとします。 'boto_client_mock'のreturn_valueでテストしたいメソッドを検証することはできます。 – idjaw

+0

@JeffTang私はあなたがしようと思っているかもしれないより詳細な例(テストされておらず、全体的なアイデアを提供したかっただけです)を提供しました。 – idjaw

1

やろうとしている何をすべきか、多くの例がありmocking documentationを通読することをお勧め

class SomeTest(Unittest.TestCase): 
    @mock.patch('path.to.Cleaner.boto3.client', return_value=Mock()) 
    def setUp(self, boto_client_mock): 
     self.cleaner_client = boto_client_mock.return_value 

    def your_test(self): 
     # call the method you are looking to test here 

     # simple test to check that the method you are looking to mock was called 
     self.cleaner_client.desribe_tags.assert_called_with() 

:だから、あなたのパッチ適用は、実際の線に沿って何かする必要がありますときtrying to mock a different method for the S3 client

import botocore 
from mock import patch 
import boto3 

orig = botocore.client.BaseClient._make_api_call 

def mock_make_api_call(self, operation_name, kwarg): 
    if operation_name == 'DescribeTags': 
     # Your Operation here! 
     print(kwarg) 
    return orig(self, operation_name, kwarg) 

with patch('botocore.client.BaseClient._make_api_call', new=mock_make_api_call): 
    client = boto3.client('ec2') 
    # Calling describe tags will perform your mocked operation e.g. print args 
    e = client.describe_tags() 

は、それがあなたのクリーンアップモジュール内部:)

関連する問題