我想使用单元测试来测试batch_write方法。
//content.jwplatform.com/videos/7RtXk3vl-52qL9xLP.mp4
我想模拟batch_writer()。我已经看到过使用嘲笑模拟_打开来模拟文件打开方法。但是我不太了解我能否模拟此流batch_writer()调用。
答案 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
我希望它可以帮助某人!