簡體   English   中英

在 python 中模擬 boto3 批量寫入進行單元測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM