Не удается смоделировать метод из boto3 (используя botocore.stub.Stubber) - PullRequest
0 голосов
/ 08 октября 2018

В моем podcasts.py у меня есть первые строки:

kms = boto3.client('kms')
access_key = kms.decrypt(
    CiphertextBlob=base64.b64decode(os.environ['access_key'])
)['Plaintext'].decode()

В соответствии с документами , я попытался заглушить его в своем podcasts_test.py:

import base64
import os

from botocore.stub import Stubber

os.environ['access_key'] = base64.b64encode('my_test_access_key'.encode()).decode()
client = boto3.client('kms')
stubber = Stubber(client)
stubber.add_response('decrypt', {'Plaintext': b'my_test_key'})
stubber.activate()

import podcasts_build

Но я получаю:

Traceback (most recent call last):
  File "podcasts_build_test.py", line 14, in <module>
    import podcasts_build
  File "/Users/vitaly/intelligent-speaker/backend/lambdas/podcasts_build/podcasts_build.py", line 23, in <module>
    CiphertextBlob=base64.b64decode(os.environ['access_key'])
  File "/usr/local/lib/python3.7/site-packages/botocore/client.py", line 320, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python3.7/site-packages/botocore/client.py", line 623, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.InvalidCiphertextException: An error occurred (InvalidCiphertextException) when calling the Decrypt operation:

1 Ответ

0 голосов
/ 08 октября 2018

Похоже, причина этого в том, что клиент переопределяется после применения Stubber и пытается по-настоящему использовать API.

Это минимальный пример, основанный на вашем вопросепоэтому, чтобы он работал с вашим кодом, вам, вероятно, придется применять этот принцип более широко при рефакторинге.Кроме того, я хотел бы рассмотреть возможность использования unittest framework .

. Во-первых, сделать возможным передать экземпляр клиента в код, который вы тестируете.

podcasts.py:

def decrypt_kms(kms_client):
    access_key = kms_client.decrypt(
        CiphertextBlob=base64.b64decode(os.environ['access_key'])
    )['Plaintext'].decode()
    return access_key

Затем в ваших тестах создайте заглушенный клиент и передайте его в код для проверки

tests.py:

from botocore.stub import Stubber
from podcasts import decrypt_kms

kms_decrypt_response = {'Plaintext': 'my_test_key'}
stubbed_client = boto3.client('kms')
stubber = Stubber(stubbed_client)
stubber.add_response('decrypt', kms_decrypt_response)
stubber.activate()
result = decrypt_kms(kms_client=stubbed_client)
...