在Python中对嵌套对象(DynamoDB和表)使用模拟 [英] Using Mock in Python for nested objects (DynamoDB and Table)

查看:0
本文介绍了在Python中对嵌套对象(DynamoDB和表)使用模拟的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想测试具有来自DynamoDB的不同输入的函数的行为。主要有两种行为:当在表中找到搜索键时和当它没有时。以下是该函数的最小代码:

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 data.count > 0:
      # result = some_output
   else:
      result = {'status': '404'}
   return result

我想用单元测试来测试这段代码,方法是发送空结果和非空项目列表,内容大致如下:

import boto3
import unittest
from unittest.mock import Mock, patch

class TestMainHandler(unittest.TestCase): 
   ...
   def test_main_fails_on_wrong_symbol(self):
       with patch.object(main_handler, 'table') as get_mock:
          get_mock.return_value = []
          result = main('dummy_symbol')
          expect_result = {'status': '404'}
   self.assertEqual(result, expect_result)

但我不能运行模拟部分。我想知道您是否可以指导我如何模拟嵌套表和发电机变量。我非常感谢你的帮助。

推荐答案

我建议您尽可能模拟第一个"集成点",然后在此基础上构建模拟结果。在本例中,它将是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)

这篇关于在Python中对嵌套对象(DynamoDB和表)使用模拟的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆