使用 pytest-asyncio 测试 FastAPI 路由时出现“RuntimeError:事件循环已关闭”

2023-12-24

我收到错误

运行时错误:事件循环已关闭

每次我尝试在测试中进行多个异步调用时。我已经尝试使用其他 Stack Overflow 帖子中的所有其他建议来重写event_loop固定装置但没有任何作用。我想知道我错过了什么?

运行测试命令:

python -m pytest tests/ --asyncio-mode=auto

要求.txt

pytest==7.1.2
pytest-asyncio==0.18.3
pytest-html==3.1.1
pytest-metadata==2.0.1

test.py

async def test_user(test_client_fast_api):
    assert 200 == 200

    # works fine
    request_first = test_client_fast_api.post("/first_route")

    # recieve RuntimeError: Event loop is closed
    request_second = test_client_fast_api.post("/second_route")

测试.py

@pytest.fixture()
def event_loop():
    try:
        loop = asyncio.get_running_loop()
    except RuntimeError:
        loop = asyncio.new_event_loop()
    yield loop
    loop.close()

添加文件conftest.py到放置测试脚本的目录。

并编写以下代码:

import pytest
from main import app
from httpx import AsyncClient

@pytest.fixture(scope="session")
def anyio_backend():
    return "asyncio"

@pytest.fixture(scope="session")
async def client():
    async with AsyncClient(app=app, base_url="http://test") as client:
        print("Client is ready")
        yield client

然后在您自己的测试代码中使用这些装置。例如,这是我自己项目的真实测试代码。您可以将其更改为您自己的。

import pytest
from httpx import AsyncClient

@pytest.mark.anyio
async def test_run_not_exists_schedule(client: AsyncClient):
    response = await client.get("/schedule/list")
    assert response.status_code == 200
    schedules = response.json()["data"]["schedules"]
    schedules_exists = [i["id"] for i in schedules]
    not_exists_id = max(schedules_exists) + 1
    request_body = {"id": not_exists_id}
    response = await client.put("/schedule/run_cycle", data=request_body)
    assert response.status_code != 200  

@pytest.mark.anyio
async def test_run_adfasdfw(client: AsyncClient):
    response = await client.get("/schedule/list")
    assert response.status_code == 200
    schedules = response.json()["data"]["schedules"]
    schedules_exists = [i["id"] for i in schedules]
    not_exists_id = max(schedules_exists) + 1
    request_body = {"id": not_exists_id}
    response = await client.put("/schedule/run_cycle", data=request_body)
    assert response.status_code != 200

最后在项目的终端中运行

python -m pytest

如果一切顺利的话应该没问题。

这可能涉及到需要安装的库。

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

使用 pytest-asyncio 测试 FastAPI 路由时出现“RuntimeError:事件循环已关闭” 的相关文章

随机推荐

  • jQuery UI 风格的文本输入框

    jQuery UI 使按钮看起来很漂亮 button button 是否有等效的文本输入框 没有什么可以阻止你做 input button 我喜欢这个 input text input password button css font in
  • 使用 Spring 的 form 标签动态绑定列表

    我有一个命令对象FaxForm它包含一个列表FaxStatusa 内的物体faxStatusList财产 public class FaxForm private List
  • 通过 Javascript 在 Excel 中打开 HTML 页面

    我们有以 HTML 格式生成的报告 用户经常在 Excel 中打开这些报告 我们通过使用内容类型来提供足够简单的服务 然而 我们最近遇到了一个麻烦的弹出窗口 其中一些报告使用大量 JavaScript 来进行动态分组 排序 并且用户希望将报
  • 在 Angular 中从服务器下载文本/csv 内容作为文件

    我正在尝试流式传输csv来自 Node js 服务器的文件 服务器部分非常简单 server get orders function req res res setHeader content type text csv res setHe
  • 我可以使用 JQuery 获取突出显示的文本吗? [复制]

    这个问题在这里已经有答案了 我在任何地方都找不到任何东西 是否有 JQuery 解决方案来检索突出显示的文本 我需要检查突出显示的文本是否有跨度 获取这些跨度的样式属性 并据此操作它们 我可以使用正则表达式或任何显然的东西来完成该部分 但首
  • mongoDB 更新与 arrayFilters 不起作用

    我在 mongo 中有以下文档结构 简化 id 5e30208675b5400cb0894c52 locations name Pleasure Gardens id 618 areas name Koi Pond area id 159
  • 如何在 C# 中防止/取消组合框的值更改?

    我在表单顶部有一个组合框 可将可编辑数据加载到下面的字段中 如果用户进行了更改但未保存 并尝试从组合框中选择不同的选项 我想警告他们并给他们一个取消或保存的机会 我需要一个带有可取消事件参数的 BeforeValueChange 事件 关于
  • 在 Python 中创建流类

    我有一个类需要一个包含 XML 文件的流 我不一定需要文件流 我可能想使用其他源 如数据库 套接字等 我需要从什么类继承IO模块 http docs python org library io html为了从其他来源提供流接口 安德烈给出的
  • 如何拍摄黑白视频

    我是 iPhone 应用程序开发新手 我开发了一款 iPhone 应用程序 在此应用程序中 我想开发使用 iPhone 相机录制黑白视频 请帮助我如何开发这个 然后还给出一些示例代码网址 提前致谢 您想要使用 kCVPixelFormatT
  • Python 分组依据

    假设我有一组数据对 其中index 0是值并且index 1是类型 input 11013331 KAT 9085267 NOT 5238761 ETH 5349618 ETH 11788544 NOT 962142 ETH 7795297
  • 如何在 Node.js 中检索客户端和服务器 IP 地址和端口号

    我尝试进行大量搜索以找到一种方法来了解客户端和服务器的 IP 地址和端口号 到目前为止我发现 客户端IP 可以知道req ip 客户端端口 我搜索了很多 但找不到任何方法来找到这个客户端临时端口 检查完后req and res对象 我发现有
  • 使用 joda 时间的两个日期之间的秒数差异?

    假设有两个日期 A 开始时间 和 B 结束时间 A 和 B 可以是同一天甚至不同天的时间 我的任务是在几秒钟内显示差异 我正在使用的日期格式是 Date Format yyyy MM dd T HH mm ss SSSZ 例如 start
  • 找不到System.Xaml?

    我有一个 VS2010 项目需要引用 System Xaml 我转到 添加引用 搜索 NET 引用 但它不在那里 我也仔细检查了 GAC 但没有这样的运气 我就是想不通为什么它不在机器上 该计算机安装了 NET 3 5 SP1 和 NET
  • UILabel 的字体在视图重新出现之前不会调整

    使用故事板 我创建了一个带有带有标签的单元格的表格视图 我希望能够轻松地将相同的字体分配给应用程序中的所有标签 因此我在辅助文件 smallFont mediumFont 和 largeFont 中创建了一些字体tableView tabl
  • 访问 ASP.NET 中没有值的查询字符串参数

    我正在尝试设置一个具有两种行为的页面 我通过 URL 将它们分开 一种行为通过 some controller some action 另一个是通过 some controller some action customize 不过 当我访问
  • 将派生类转换为基类

    我正在尝试刷新我的记忆 但无法通过 Google 找到答案 public class BaseClass public virtual void DoSomething Trace Write base class public class
  • Docker:连接期间出错

    每当我尝试使用 RSelenium 包时 我都会收到上述错误 shell docker run d p 4445 4444 selenium standalone chrome docker error during connect Pos
  • 将 DAO 注入构造函数是否被认为是不好的做法?如果是这样,为什么?

    我有一个 DAL 数据访问层 但这个问题也与 DAO 相关 它与 android 中的静态 Web 服务进行通信 除了我不想包含大量静态库之外 它的相关性较小 交互并不那么复杂 我有一个对象 它包装一个列表 该列表由来自该数据访问层的信息填
  • 为什么我不能通过 import scipy as sp 来使用 sp.signal? [复制]

    这个问题在这里已经有答案了 我想用scipy signal lti and scipy signal impulse函数来计算传递函数 我导入scipy模块按以下方式 import scipy as sp import numpy as n
  • 使用 pytest-asyncio 测试 FastAPI 路由时出现“RuntimeError:事件循环已关闭”

    我收到错误 运行时错误 事件循环已关闭 每次我尝试在测试中进行多个异步调用时 我已经尝试使用其他 Stack Overflow 帖子中的所有其他建议来重写event loop固定装置但没有任何作用 我想知道我错过了什么 运行测试命令 pyt