我建议您模拟第一个“集成点”,然后据此构建模拟结果。在这种情况下,它将是boto3.resource
。从那里,您可以修改返回值boto3.resource
成为一个模拟表。然后,您可以将模拟表上的任何调用的返回值更改为您的预期结果。
import boto3
import unittest
from unittest.mock import Mock, patch
class TestMainHandler(unittest.TestCase):
@patch('boto3.resource')
def test_main_fails_on_wrong_symbol(self, mock_dynamo):
mock_table = Mock()
mock_table.query.return_value = []
mock_dynamo.Table.return_value = mock_table
result = main('dummy_symbol')
expected_result = {'status': '404'}
self.assertEqual(expected_result, result)
另请注意,我在测试用例上使用了补丁装饰器,而不是上下文管理器。这对我来说是一个偏好问题,但我认为它看起来更干净。
编辑:我在分配返回值时出错mock_dynamo
函数调用。我也填写了你的if
测试查询数据的长度并返回一些内容。但这里的测试并未到达该分支。这是最终产品:
"""boto_main.py"""
import boto3
from boto3.dynamodb.conditions import Key
def main(symbol):
dynamo = boto3.resource("dynamodb")
table = dynamo.Table("mytable")
data = table.query(KeyConditionExpression=Key("symbol").eq(symbol))
if len(data) > 0:
result = {'status': '200'}
else:
result = {'status': '404'}
return result
"""boto_test.py"""
import unittest
from unittest.mock import Mock, patch
from boto_main import main
class TestMainHandler(unittest.TestCase):
@patch('boto3.resource')
def test_main_fails_on_wrong_symbol(self, mock_dynamo):
mock_table = Mock()
mock_table.query.return_value = []
mock_dynamo.return_value.Table.return_value = mock_table
result = main('dummy_symbol')
expected_result = {'status': '404'}
self.assertEqual(expected_result, result)