FastAPI 中的模拟依赖类

发布于 2025-01-16 18:31:05 字数 908 浏览 2 评论 0原文

我有一个 api,它代表以下结构:

from fastapi import FastAPI, Depends, Request, APIRouter


class SomeManager:

    def get_value_from(self, s: str):
        return GetValue(s, self)


class GetValue:

    def __init__(self, value: str, parent: SomeManager):
        self.str = str

    def __call__(self, *args, **kwargs) -> str:
        return self.str


api = FastAPI()
manager = SomeManager()

def generate_routes(m: SomeManager):
    router = APIRouter(prefix="/test")
    @router.get("")
    def test(value = Depends(m.get_value_from("hi"))):
        return value
    return router

test_router = generate_routes(manager)
api.include_router(test_router)

我想测试我的 API,覆盖 m.get_value_from 方法。我希望做类似的事情:

def mock_get_value():
   return "test_str"

monkeypatch.setattr(GetValue, "__call__", mock_get_value)

但它似乎不起作用。

我如何模拟这种依赖关系?

I have an api which is representative of the structure of:

from fastapi import FastAPI, Depends, Request, APIRouter


class SomeManager:

    def get_value_from(self, s: str):
        return GetValue(s, self)


class GetValue:

    def __init__(self, value: str, parent: SomeManager):
        self.str = str

    def __call__(self, *args, **kwargs) -> str:
        return self.str


api = FastAPI()
manager = SomeManager()

def generate_routes(m: SomeManager):
    router = APIRouter(prefix="/test")
    @router.get("")
    def test(value = Depends(m.get_value_from("hi"))):
        return value
    return router

test_router = generate_routes(manager)
api.include_router(test_router)

I want to test my API, overwriting the m.get_value_from method. I was hoping to do something like:

def mock_get_value():
   return "test_str"

monkeypatch.setattr(GetValue, "__call__", mock_get_value)

But it doesn't seem to work.

How can I mock this dependency?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

能怎样 2025-01-23 18:31:06

您可以尝试使用FastApi 方式覆盖依赖项。我创建了一个 包装库,它添加了一个名为:fastapi_dep< /代码>。

像这样使用它:

def test_create_user(fastapi_dep):
    def mock_get_value():
        return "test_str"
    with fastapi_dep(app).override({SomeManager.get_value_from: mock_get_value}):
        response = client.post(....)
        # the rest of your test

You can try to use the FastApi way of overriding dependencies. I created a wrapper library which adds a pytest fixture named: fastapi_dep.

Use it like so:

def test_create_user(fastapi_dep):
    def mock_get_value():
        return "test_str"
    with fastapi_dep(app).override({SomeManager.get_value_from: mock_get_value}):
        response = client.post(....)
        # the rest of your test
笔落惊风雨 2025-01-23 18:31:05

您可以模拟方法本身

def mock_get_value(self, s: str):
   return "test_str"

monkeypatch.setattr(SomeManager, "get_value_from", mock_get_value)

You can mock the method itself

def mock_get_value(self, s: str):
   return "test_str"

monkeypatch.setattr(SomeManager, "get_value_from", mock_get_value)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文