python 3:模拟boto3 S3客户端的方法

时间:2018-05-25 19:54:26

标签: python-3.x unit-testing mocking boto3 botocore

我想对一些调用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.mockbotocore.stub.Stubber混淆了但是还没有成功解决这个问题。除非另有说明,否则我没有发布我的尝试,因为他们迄今尚未成功。

我愿意接受有关重构我正在尝试测试的代码的建议,以便更容易测试。

1 个答案:

答案 0 :(得分:1)

让测试使用以下内容,其中...是预期传递给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()