【问题标题】:mocking the session argument模拟会话参数
【发布时间】:2020-02-05 21:21:55
【问题描述】:

我正在尝试在另一个文件中为上述方法编写一个单元测试,例如test.py。我无法模拟会话。

# app.py
import requests

def get_json_data(url, session):
    response = session.get(url)
    response.raise_for_status()
    return response.json()

我带来了以下测试。失败了

class TestDoSessionGet(unittest.TestCase):

    @mock.patch('requests.session')
    def test_should_mock_session_get(self, mocker):

        data = """{
                        "userId": 1,
                        "id": 1,
                        "title": "delectus aut autem",
                        "completed": false
                    }"""
        j_data = json.loads(data)

        #print(j_data)
        mocker.return_value = Mock(ok=True)
        mocker.return_value.json.return_value = j_data

        response = get_json_data('https://jsonplaceholder.typicode.com/todos/1', requests.Session())
        print(response)
        self.assertTrue(mocker.called)
        self.assertEqual(response, j_data)

【问题讨论】:

标签: python unit-testing mocking pytest python-unittest


【解决方案1】:

您没有使用requests 模块。您可以创建一个模拟的session 来测试get_json_data 函数。

例如

app.py:

def get_json_data(url, session):
    response = session.get(url)
    response.raise_for_status()
    return response.json()

test_app.py:

import unittest
import json
from app import get_json_data
from unittest.mock import Mock


class TestDoSessionGet(unittest.TestCase):

    def test_should_mock_session_get(self):
        data = {
            "userId": 1,
            "id": 1,
            "title": "delectus aut autem",
            "completed": False
        }
        mock_session = Mock()
        mock_response = Mock()
        mock_session.get.return_value = mock_response
        mock_response.json.return_value = data

        response = get_json_data('https://jsonplaceholder.typicode.com/todos/1', mock_session)

        mock_session.get.assert_called_once_with('https://jsonplaceholder.typicode.com/todos/1')
        mock_response.raise_for_status.assert_called_once()
        mock_response.json.assert_called_once()
        self.assertEqual(response, data)


if __name__ == '__main__':
    unittest.main()

带有覆盖率报告的单元测试结果:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                     Stmts   Miss  Cover   Missing
----------------------------------------------------------------------
src/stackoverflow/60084306/app.py            4      0   100%
src/stackoverflow/60084306/test_app.py      18      0   100%
----------------------------------------------------------------------
TOTAL                                       22      0   100%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2016-12-25
    • 2019-03-21
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多