首页 > 解决方案 > 模拟请求.post

问题描述

pytest用来测试一个调用requests.post. 有没有一种简单的方法,最好没有第三方库来做到这一点?

class Dispatcher:
    def __init__(self, url):
    self.url = url
    self.session = None

    def dispatch(self):
        return self.session.post(self.url).json()


def test_dispatch():
    d = Dispatcher(url="")
    d.session = # ... here, how can I mock the return value of json()?
    result = d.dispatch()

标签: pythonpytest

解决方案


所以这是一个非常简单的例子。我们想设置session为一个MagicMock对象。

from unittest.mock import MagicMock

def test_dispatch():
    expected = {"fizz": "buzz"}
    mock_session = MagicMock()
    mock_session.configure_mock(
        **{
            "post.return_value": mock_session,
            "json.return_value": expected
        }
    )

    d = Dispatcher(url="")
    d.session = mock_session
    result = d.dispatch()

    assert result == expected

由于Mock对象在调用方法时(未配置)返回一个全新的模拟对象,因此我们必须像这样配置对象。如果我们没有配置post返回我们拥有的原始模拟,那么它将返回一个全新的模拟对象,我们的测试将失败。相反,您可以将另一个Mock对象配置为该对象的返回值post并配置该对象,但我更喜欢这种方法。

下面列出了显示呼叫的说明。

self.sessionmock_session我们创建的对象

self.session.post(arg, **kwargs)返回mock_session

mock_session.json()返回我们指定的字典


推荐阅读