首页 > 解决方案 > 为什么 requests-mock 装饰器模式会在 pytest 中抛出“fixture 'm' not found”错误?

问题描述

我正在使用requests库发出 HTTP GET 请求。例如(截断):

requests.get("http://123-fake-api.com")

我已经按照requests-mock 装饰器模式编写了一个测试。

import requests
import requests_mock


@requests_mock.Mocker()
def test(m):
    m.get("http://123-fake-api.com", text="Hello!")

    response = requests.get("http://123-fake-api.com").text

    assert response.text == "Hello!"

当我使用pytest运行测试时,出现以下错误。

E       fixture 'm' not found

为什么 requests-mock 装饰器会抛出“fixture 'm' not found”错误?我该如何解决?

标签: python-requestsmockingpytestpython-decoratorsrequests-mock

解决方案


您收到错误是因为 Python 3 中无法识别 Requests Mock 装饰器(请参阅 GitHub 问题)。要解决该错误,请使用如何在具有模拟装饰器的测试中使用 pytest capsys 中引用的解决方法?.

import requests
import requests_mock


@requests_mock.Mocker(kw="mock")
def test(**kwargs):
    kwargs["mock"].get("http://123-fake-api.com", text="Hello!")

    response = requests.get("http://123-fake-api.com")

    assert response.text == "Hello!"

附加选项

您还可以使用以下替代方法之一。

1.请求模拟的pytest插件

使用 Requests Mock 作为pytest fixture

import requests


def test_fixture(requests_mock):
    requests_mock.get("http://123-fake-api.com", text="Hello!")

    response = requests.get("http://123-fake-api.com")

    assert response.text == "Hello!"

2.上下文管理器

使用 Requests Mock 作为上下文管理器

import requests
import requests_mock


def test_context_manager():
    with requests_mock.Mocker() as mock_request:
        mock_request.get("http://123-fake-api.com", text="Hello!")
        response = requests.get("http://123-fake-api.com")

    assert response.text == "Hello!"

推荐阅读