Python 3: макет метод клиента S3 boto3 - PullRequest
0 голосов
/ 25 мая 2018

Я хочу провести модульное тестирование некоторого кода, который вызывает метод клиента boto3 s3.Я не могу использовать moto, потому что этот конкретный метод (put_bucket_lifecycle_configuration) еще не реализован в moto.Я хочу издеваться над клиентом S3 и заверить, что этот метод был вызван с конкретными параметрами.

Код, который я хочу протестировать, выглядит примерно так:

# sut.py
import boto3

class S3Bucket(object):
    def __init__(self, name, lifecycle_config):
        self.name = name
        self.lifecycle_config = lifecycle_config

    def create(self):
        client = boto3.client("s3") 
        client.create_bucket(Bucket=self.name)
        rules = # some code that computes rules from self.lifecycle_config
        # I want to test that `rules` is correct in the following call:
        client.put_bucket_lifecycle_configuration(Bucket=self.name, \
          LifecycleConfiguration={"Rules": rules})

def create_a_bucket(name):
    lifecycle_policy = # a dict with a bunch of key/value pairs
    bucket = S3Bucket(name, lifecycle_policy)
    bucket.create()
    return bucket

В моем тесте я хотел бы вызвать create_a_bucket() (хотя создание экземпляра S3Bucket напрямую такжеи убедитесь, что вызов put_bucket_lifecycle_configuration был сделан с правильными параметрами.

Я перепутал с unittest.mock и botocore.stub.Stubber, но мне не удалось взломать это.Если не указано иное, я не публикую свои попытки, поскольку они пока не увенчались успехом.

Я открыт для предложений по реструктуризации кода, который я пытаюсь протестировать, чтобы облегчить его тестирование.

1 Ответ

0 голосов
/ 12 июня 2018

Получил тест для работы со следующим, где ... - остаток аргументов, которые, как ожидается, будут переданы s3.put_bucket_lifecycle_configuration().

# test.py
from unittest.mock import patch
import unittest

import sut

class MyTestCase(unittest.TestCase):
    @patch("sut.boto3")
    def test_lifecycle_config(self, cli):
        s3 = cli.client.return_value
        sut.create_a_bucket("foo")
        s3.put_bucket_lifecycle_configuration.assert_called_once_with(Bucket="foo", ...)


if __name__ == '__main__':
    unittest.main()
...