[英]Mock boto3 batch write for unit testing in python
我想使用單元測試來測試 batch_write 方法。
class DataService:
def __init__(self, table):
dynamodb = boto3.resource('dynamodb', region_name='us-west-2')
self.db = dynamodb.Table(self.table)
def batch_write(self, items):
with self.db.batch_writer() as batch:
for item in items:
batch.put_item(Item=item)
我想模擬batch_writer()。 我已經看到使用 mock_open 來模擬文件打開方法。 但我真的不明白我可以模擬這個流式 batch_writer() 調用。
我也遇到了這個問題,這就是我解決它的方法。
from mock import MagicMock
class TestClass():
def __enter__(self, *args):
return self
def __exit__(self, *args):
pass
cls = TestClass()
cls.put_item = MagicMock()
repository.table.batch_writer = MagicMock()
repository.table.batch_writer.return_value = cls
print cls.put_item.call_args_list
現在我可以通過我的模擬測試類代替 batch_writer 來模擬調用或檢查參數。 我知道這是一個老問題,但我一直在努力解決這個問題,並希望有人能發布一個代碼示例,如果這很容易做到的話。 如果有更好更簡單的方法使用任何人擁有的補丁,請發布。
我根據 Codyj110 的想法編寫了一個略有不同的版本,但不需要創建 TestClass。
我沒有創建新類,而是使用__enter__
值設置__enter__
和__exit__
方法。
class TestClassRequiringMockOnDynamoDbBatchWriter:
@patch('boto3.resource')
def test_mocked_batch_writer(self, mock_dynamo_db):
mock_db, mock_batch_writer = self._get_mocked_dynamo_objects(fake_exception)
mock_dynamo_db.return_value = mock_db
assert mock_batch_writer.put_item.call_count == my_expected_calls
@staticmethod
def _get_mocked_dynamo_objects(expected_value):
mock_batch_writer = Mock()
mock_batch_writer.__enter__ = Mock(return_value=mock_batch_writer)
mock_batch_writer.__exit__ = Mock(return_value=None)
# Use side_effect or return_value according to your intention
mock_batch_writer.put_item.side_effect = expected_value
mock_table = Mock()
mock_table.batch_writer.return_value = mock_batch_writer
mock_db = Mock()
mock_db.Table.return_value = mock_table
return mock_db, mock_batch_writer
我希望它可以幫助某人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.