gpt4 book ai didi

python - 如何使用 autouse 全局定义补丁?

转载 作者:行者123 更新时间:2023-12-04 16:44:48 24 4
gpt4 key购买 nike

现在我在一些测试中这样做来模拟 3rd 方 API:

@patch("some.api.execute")
def sometest(
mock_the_api, blah, otherstuff
):
mock_the_api.return_value = "mocked response"
my_func_that_uses_api(blah, otherstuff)
这有效并防止 my_func_that_uses_api()(调用 API)进行实际的出站调用。但是我这样做了 4-5 次,将来可能会添加更多。我想为我的所有测试在全局范围内模拟这个。
我在 the docs 看到这个例子:
@pytest.fixture(autouse=True)
def no_requests(monkeypatch):
"""Remove requests.sessions.Session.request for all tests."""
monkeypatch.delattr("requests.sessions.Session.request")
除了修补 API 响应之外,我该怎么做?
我试过 monkeypatch.patch("some.api.execute")但得到错误 AttributeError: 'MonkeyPatch' object has no attribute 'patch'另外,补充一下,我没有在我的 pytest 测试中使用任何类(比如测试用例)——我想暂时避免在我的 pytests 测试中使用类。

最佳答案

你可以只使用:

from unittest import mock
import pytest

@pytest.fixture(autouse=True)
def my_api_mock():
with mock.patch("some.api.execute") as api_mock:
api_mock.return_value = "mocked response"
yield api_mock

def test_something(blah, otherstuff):
my_func_that_uses_api(blah, otherstuff)

fixture 的生命周期与每个功能一样长,因此在每个功能结束时恢复修补。
请注意,在这种情况下不需要生成模拟,但是如果我们想在某些测试用例中更改模拟,这使您可以访问它:
def test_something(blah, otherstuff):
my_func_that_uses_api(blah, otherstuff)

def test_something_else(my_api_mock, blah, otherstuff):
my_api_mock.return_value = "other response for this test"
my_func_that_uses_api(blah, otherstuff)

为了完整起见,没有 auto-use这将是:
@pytest.fixture
def my_api_mock():
with mock.patch("some.api.execute") as api_mock:
api_mock.return_value = "mocked response"
yield api_mock

def test_something(my_api_mock, blah, otherstuff):
my_func_that_uses_api(blah, otherstuff)

关于python - 如何使用 autouse 全局定义补丁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61581645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com