python3:模拟boto3 S3客户端的一个方法
python 3: mock a method of the boto3 S3 client
我想对一些调用 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
但没能破解这个问题。除非另有要求,否则我不会发布我的尝试,因为到目前为止它们还没有成功。
我乐于接受有关重构我正在尝试测试的代码的建议,以使其更易于测试。
获得了适用于以下内容的测试,其中 ...
是预期传递给 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()
我想对一些调用 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
但没能破解这个问题。除非另有要求,否则我不会发布我的尝试,因为到目前为止它们还没有成功。
我乐于接受有关重构我正在尝试测试的代码的建议,以使其更易于测试。
获得了适用于以下内容的测试,其中 ...
是预期传递给 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()