我正在使用 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 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!"
您还可以使用以下替代方案之一。
使用请求模拟作为 pytest 固定装置。
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!"
使用请求模拟作为上下文管理器。
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!"