模拟boto3批处理写以在python中进行单元测试

时间:2018-07-27 05:42:43

标签: python unit-testing mocking boto3

我想使用单元测试来测试batch_write方法。

//content.jwplatform.com/videos/7RtXk3vl-52qL9xLP.mp4

我想模拟batch_writer()。我已经看到过使用嘲笑模拟_打开来模拟文件打开方法。但是我不太了解我能否模拟此流batch_writer()调用。

2 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,这就是我解决的方法。

    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来模拟调用或检查参数。我知道这是一个古老的问题,但这是我一直在努力的问题,希望有人能发布一个代码示例(如果此操作很容易的话)。如果有更好的使用任何人都拥有的补丁的简便方法,请发表。

答案 1 :(得分:0)

我根据Codyj110的想法编写了一个略有不同的版本,但不需要创建TestClass。

我没有创建新的类,而是使用模拟值设置了__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

我希望它可以帮助某人!