如何在pytest单元测试中使用PropertyMock返回请求-响应属性?

2024-05-17 04:36:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我将pytest-mock wrapper与pytest一起使用。你知道吗

我找不到PropertyMock来处理requests package。你知道吗

下面是一个我尝试单元测试的函数示例:

def get():
    url = f'http://foo.bar/'
    response = requests.get(url)
    if response.status_code != 200:
        sys.exit(1)
    return response.text

下面是我对单元测试的尝试:

import pytest
import my_module
import requests

def test_get(mocker, monkeypatch):
    response_mock = mocker.MagicMock()
    status_code_mock = mocker.PropertyMock(return_value=200)
    text_mock = mocker.PropertyMock(return_value='xyz')
    type(response_mock).status_code = status_code_mock
    type(response_mock).text = text_mock
    monkeypatch.setattr(requests, 'get', response_mock)

    my_module.get()

测试失败,因为response.status_code没有返回200。你知道吗

我尝试在requests.get()调用之后放置一个PDB断点,并检查了响应状态代码把我自己归于PDB。我得到一个MagicMock对象:

(Pdb) response.status_code
<MagicMock name='mock().status_code' id='4487925656'>

Tags: textimportgetreturnpytestresponsedefstatus
1条回答
网友
1楼 · 发布于 2024-05-17 04:36:09

它是分配给response变量的requests.get调用的返回值。你知道吗

在此行中:

monkeypatch.setattr(requests, 'get', response_mock)

您将get方法本身替换为mock。但您可能想用调用时返回您的响应的东西来替换它,例如:

monkeypatch.setattr(requests, 'get', lambda url: response_mock)

另一方面,考虑使用现有的pytest插件/装置来编写此代码。^{}^{}都是不错的选择。例如,在pip install requests_mock之后,您的测试可以如下所示:

def test_get_better(requests_mock):
    requests_mock.get("http://foo.bar/", text="xyz")
    response_text = my_module.get()
    assert response_text == "xyz"

相关问题 更多 >