覆盖具有参数的 FastAPI 依赖项

2024-01-02

我正在尝试使用官方推荐的方法覆盖注入的数据库来测试我的 FastAPI 端点FastAPI文档 https://fastapi.tiangolo.com/advanced/testing-dependencies/.

我注入数据库的函数是一个闭包,它允许我通过给定数据库名称来从 MongoClient 构建任何所需的数据库,同时(我假设)仍然使用 FastAPI dependent,因为它返回闭包函数的签名。没有抛出错误,所以我认为这个方法是正确的:

# app
def build_db(name: str):
    def close():
          return build_singleton_whatever(MongoClient, args....)
     return close

将其添加到端点:

# endpoint
@app.post("/notification/feed")
async def route_receive_notifications(db: Database = Depends(build_db("someDB"))):
   ...

最后,尝试在测试中覆盖它:

# pytest
# test_endpoint.py
fastapi_app.dependency_overrides[app.build_db] = lambda x: lambda: x

然而,依赖关系似乎根本没有被覆盖,测试最终会像正常执行一样使用生产数据库的 IP 创建一个 MongoClient。

So,关于覆盖在其端点中给定参数的 FastAPI 依赖项有什么想法吗?

我尝试创建一个模拟闭包函数,但没有成功:

def mock_closure(*args):
    def close():
        return args
    return close

app.dependency_overrides[app.build_db] = mock_closure('otherDB')

我也尝试提供相同的签名,包括参数,但仍然没有成功:

app.dependency_overrides[app.build_db('someDB')] = mock_closure('otherDB')

编辑备注我也知道我可以创建一个单独的函数来创建我想要的数据库并将其用作依赖项,但我更喜欢使用这个动态版本,因为它更具可扩展性,可以在我的应用程序中使用更多数据库,并避免我基本上重复编写功能只是为了可以干净地注入它们。


我的案例涉及 HTTP 客户端包装器,而不是数据库。我认为它也可以适用于您的情况。

上下文:我想为 FastAPI 处理程序的依赖项注入值来测试各种场景。

我们有一个处理程序及其依赖项

@router.get("/{foo}")
async def get(foo, client = Depends(get_client)): # get_client is the key to override
  client = get_client()
  return await client.request(foo)

功能get_client是我想在测试中覆盖的依赖项。它返回一个Client该对象接受一个函数,该函数对外部服务执行 HTTP 请求(该函数实际上包装了aiohttp,但这不是重要的部分)。这是它的准系统定义:

class Client:
  def __init__(request):
    self._request = request
  
  async def request(self, params):
    return await self._request(params)

我们想要测试来自外部服务的各种响应,因此我们需要构建返回一个函数的函数,该函数返回一个Client对象(抱歉绕口令),及其参数:

def get_client_getter(response):
  async def request_mock(*args, **kwargs):
    return response

  def get_client():
    return Client(request=request_mock)

  return get_client()

然后在各种测试中我们有:

def test_1():
    app.dependency_overrides[get_client] = get_client_getter(1)
    ...

def test_true():
    app.dependency_overrides[get_client] = get_client_getter(True)
    ...

def test_none():
    app.dependency_overrides[get_client] = get_client_getter(None)
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖具有参数的 FastAPI 依赖项 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • python pandas 中的双端队列

    我正在使用Python的deque 实现一个简单的循环缓冲区 from collections import deque import numpy as np test sequence np array range 100 2 resha
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 如何使用 codeigniter 锁定表?

    我必须在模型中运行这个 sql 例程 this gt db gt query LOCK TABLE orders WRITE this gt db gt query TRUNCATE TABLE orders this gt db gt q
  • 从 master 分支构建到 gh-pages 分支

    我想做的事 我正在使用github 我有两个分支机构 主页面和 gh 页面 我的 master 分支上有一个 unity3d 项目 当我运行它时 它将生成一个网页 我想在 gh pages 分支上显示网页的内容 我认为这意味着我必须在存储库
  • 如何通过区分类型来隔离枚举?

    下面的代码定义了两个枚举 class Insect BEE 0x00 WASP 0x01 BUMBLEBEE 0x02 class Breakfast HAM 0x00 EGGS 0x01 PANCAKES 0x02 b Insect WA
  • 如何根据 R 中其他行和列中的值来填充数据框

    假设我有一个如下所示的数据框 ID T X Y Z 1 1 A A NA 1 2 B A NA 1 3 B B NA 1 4 B A NA 2 1 A B NA 2 2 A A NA 2 3 B A NA 2 4 A B NA 3 1 B
  • Java 中埃拉托斯特尼的并行筛法

    我正在尝试并行实现埃拉托斯特尼筛法 我创建了一个布尔列表 其中填充了给定大小的 true 值 每当找到素数时 该素数的所有倍数都会在布尔列表中标记为 false 我尝试使该算法并行的方法是启动一个新线程 同时仍然过滤初始素数 例如 该算法以
  • 使用 Sapera 拍摄图像并将数据复制到矢量

    我如何拍摄图像萨佩拉SDK https www teledynedalsa com en products imaging vision software sapera lt 并传输图像数据SapBuffer对象到向量 要使用 Sapera
  • 如何将字典赋予字典值[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个有趣的问题 有谁知道我们是否可以为字典的价值提供另一本字典 例子 var dict1 new Dictionary
  • Python JSON TypeError 列表索引必须是整数或切片,而不是 str

    我目前正在尝试从发布请求响应中解析一些数据 并且不断收到此错误 TypeError 列表索引必须是整数或切片 而不是 str Python代码 import requests import json count 0 params var1
  • Android 中的 Webview 建立内存

    在我的混合 Android 应用程序中 ListView项目点击我正在加载WebView通过通过WebViewActivity 以及要在其中显示的 url 用户可以通过单击后退按钮返回到先前的视图 但点击 3 4 后发生的事情ListVie
  • 使用 espresso 解锁模拟器屏幕

    我正在开发我的第一个 Android 应用程序 并且正在设置 CI 服务器 我的浓缩咖啡测试在我的机器上运行良好 但 travis 出现以下错误 java lang RuntimeException 等待视图层次结构的根获得窗口焦点并且在超
  • 如何将字节数组转换为位图图像?

    在这里 我附加了将位图转换为字节数组的代码 现在我必须重新生成位图以在 android 图像视图中显示 在下面的代码中 mRawBitmapData 是字节 Araay 这里的代码是为转换后的图像创建字节数组 所以现在我必须从这个字节数组重
  • 示例请求正文中 JsonPatchDocument 的 Swagger 意外 API PATCH 操作文档

    我正在制作 Core 3 1 Web API 并使用杰森补丁 https learn microsoft com en us aspnet core web api jsonpatch view aspnetcore 3 1创建 PATCH
  • Magento 模块中的 Mydomain 错误

    我正在本地计算机上为 Magento 安装 B2B 扩展 没有出现任何问题 但是 在对客户端服务器执行相同操作时 我收到以下错误 404 Not Found The server can not find the requested pag
  • 使用 Maven 时如何解决更严格的 Java 8 Javadoc

    您很快就会意识到 JDK8 在 Javadoc 方面更加严格 默认情况下 link http docs oracle com javase 8 docs technotes guides javadoc whatsnew 8 html 请参
  • ASP.NET Core MVC 中是否继续支持 Ninject?

    我一直很高兴使用Ninject已经很久了 我真的很喜欢它 但是自从发布以来我面临着一个艰难的选择ASP NET Core and MVC Core 基本上 微软已经公开了他们自己的依赖注入系统 据我所知 这一点受到了很多批评 但我更大的问题
  • 启动和停止广播接收器

    我想通过两个按钮启动和停止广播接收器 我已经在两个按钮侦听器中为此编写了代码 代码如下 在startButton中我编写了注册接收器的代码如下 startCallBtn setOnClickListener new View OnClick
  • 为什么我们可以使用鼠标滚轮更新输入的数字值?

    为什么可以更新a的值input type number 在 React 中使用鼠标滚轮 但在纯 HTML 中不使用 React https codesandbox io s festive morse l28c7 https codesan
  • 尝试为 Android 创建 hello world 示例时出现“无效的命令行参数”错误

    我刚刚决定开始开发 Android 应用程序 但遇到了一些问题 当我尝试构建 hello world 示例时出现此错误http developer android com resources tutorials hello world ht
  • 重定向 URL 不适用于 Iframe

    我需要的 当用户点击视频网址时 它必须重定向到您的视频 我们正在使用 html5lightbox 插件 我面临的问题 重定向在 iframe 中不起作用 虽然当我点击 iframe 的 src 时 它会被重定向到 youtube url 这
  • 覆盖具有参数的 FastAPI 依赖项

    我正在尝试使用官方推荐的方法覆盖注入的数据库来测试我的 FastAPI 端点FastAPI文档 https fastapi tiangolo com advanced testing dependencies 我注入数据库的函数是一个闭包