在 Python 中使用 Mock 来实现嵌套对象(DynamoDB 和表)

2024-01-19

我想使用来自 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中使用 Mock 来实现嵌套对象(DynamoDB 和表) 的相关文章

随机推荐

  • IMFMediSource 不支持 IKsPropertySet 接口

    我正在将基于 Direct Show 相机的 SDK 移植到 MFT 在我的旧代码中 我有 KSProxy 接口 如 IksTopolgy IKsControl 和 IKsProperty IksTopolgy IKsControl 用于枚
  • 如何在 JavaScript 中将值从一个 html 页面传递到另一个页面?

    我知道这个问题问了很多次 但我的问题有所不同 我有 3 个 html 页面 例如apply html personal info html resume info html 在 apply html 页面中 我使用一个 LinkedIn 按
  • 从 android init.rc 执行静态程序

    我想在以下位置启动一个自定义程序init过程 我静态编译了这个程序 它可以在我启动的 android stock ROM 中正常运行 来自安卓init rc我读到的文档exec命令是我需要的 顺便说一句 我能看到的都是dmesg我的程序退出
  • 如何在Azure功能上安装apt-get包

    在 Linux 消费计划上运行 python Azure 函数 我已经能够使用 VS Code 成功将该函数部署到 Azure requirements txt 中的所有包都可以顺利安装 但现在我需要安装tesseract 它只能通过apt
  • 是否可以对特定于浏览器的 CSS 使用 mixin

    我正在寻找一种使用 mixin 进行特定于浏览器的 CSS hack 的解决方案 我正在使用 JavaScript 在 HTML 类中添加浏览器标签 喜欢 ie ie7 ie8 ie9 我想使用 mixin 像 box test margi
  • 创建自定义 DatePicker 对话框

    要求 当用户单击 TextView 时 应打开一个日期选择器 选择的默认日期应该是 TextView 中的日期 如果日期是过去的日期 则应禁用 DatePicker 对话框的 设置 按钮 如果可点击的 TextView 为空 则 DateP
  • 数据库驱动类动态加载

    我想用 java 开发一个与数据库无关的应用程序 我选择hibernate作为ORM jdbc的问题在于 它只是一个接口 我们需要在类路径中包含db的驱动程序类 由于数据库应该是可配置的 我必须动态加载数据库的驱动程序类 用户应该将驱动程序
  • graphviz - 如何在矩形布局中以循环方式排列节点?

    预脚本 就在我完成这些示例时 我看到了 往返 流程主题 https stackoverflow com questions 18877045 graphviz how to create a roundtrip flow 看起来不错 既然我
  • 图片上方半透明div

    我有一个角色的 PNG 图像 我想要类似的东西 http www swfcabin com open 1364482220 http www swfcabin com open 1364482220 如果有人点击角色身体的一部分 它将被 选
  • Django REST Framework - 如何返回 404 错误而不是 403

    仅当用户经过身份验证并且满足某些其他条件时 我的 API 才允许访问 任何请求 某些对象 class SomethingViewSet viewsets ModelViewSet queryset Something objects fil
  • 我们有专门针对 Spring 5.x 的 XSD 吗?

    谁能告诉我 Spring 5 版本的 XSD 是否可用 有没有类似的东西spring beans 5 1 xsd spring context 5 1 xsd spring mvc 5 1 xsd or spring beans 5 0 x
  • C++ Linux 与另一个程序交互 stdin / stdout

    我在 Linux 中有一个可以与 stdin stdout 交互的可执行文件 我正在尝试用 C 编写一个程序 它可以交互地调用该程序 向其标准输入发送命令 并捕获其标准输出 我真的很困惑 我不想分叉我的程序 是吗 我确实希望我的程序能够启动
  • 异步连接管道

    我想将相同的信息写入两个管道 但我不想等待第一个管道读取 这是一个例子 mkfifo one mkfifo two echo hi tee one two cat one cat two cat one直到开始阅读cat two正在运行 有
  • 我如何请求浏览器始终更新(也称为从不缓存)某些页面元素,例如 CSS 表?

    我在开发页面时注意到一个始终困扰我的问题 虽然 Firefox 我常用的 开发 浏览器 总是在服务器上更改 CSS 和图像时更新它们 但 Internet Explorer 并不总是这样做 通常 我需要刷新 IE 中的页面 然后它才会向服务
  • 使用Selenium + Scrapy

    我正在尝试将 scrapy 与 selenium 结合使用 以便能够与 javascript 交互 并且仍然拥有 scrapy 提供的强大的抓取框架 我写了一个访问的脚本http www iens nl http www iens nl 在
  • EntityFramework.6.1.2-beta1\tools\init.ps1 受到限制,无法运行enable-migrations 命令

    Visual Studio 2013 C ASP NET MVC 问题 EntityFramework 6 1 2 beta1 tools init ps1 无法加载 因为其执行被软件限制策略阻止 有关详细信息 请联系您的系统管理员 当我尝
  • Android Studio 收到“必须实现 OnFragmentInteractionListener”

    我收到一条消息 上面写着 必须实现 OnFragmentInteractionListener 而且我已经有了它 我已经查看了这里提出的每个问题 但没有人帮助我 有人可以帮我吗 ERROR FATAL EXCEPTION main Proc
  • 如何找出 next() 何时到达末尾,然后转到第一项

    我使用 next 函数显示一系列元素 不过 一旦到达终点 我想转到第一个元素 有任何想法吗 这是代码 Prev Next Click nextSingle click function Get the height of the next
  • 切换 Git 分支时处理 DataBinding 错误

    在数据绑定布局已更改 删除的 Git 分支之间切换时 我遇到了很多数据绑定问题 当切换 Git 分支时删除文件时 我经常会遇到这样的构建错误
  • 在 Python 中使用 Mock 来实现嵌套对象(DynamoDB 和表)

    我想使用来自 DynamoDb 的不同输入来测试函数的行为 有两种主要行为 当在表中找到搜索关键字时和当未在表中找到搜索关键字时 这是该函数的最小代码 import boto3 from boto3 dynamodb conditions