Python单测各种模拟的使用

Python单测各种模拟的使用

相关包

from unittest import mock
from unittest.mock import patch
from unittest.mock import MagicMock

模拟类方法

同《模拟函数》

模拟requests

requests.get = MagicMock(return_value=MagicMock(json=MagicMock(return_value={"data": "日志"})))

模拟变量

根据变量所在的包路径引入

with patch("path1.path2.变量名", "变量值"):
    resp_data = self.handler.get_data("other", "scenelog 2023-05-06")
    \# 断言返回值
    self.assertEqual(resp_data, "")

模拟函数

可以通过装饰器模拟,多个模拟多行,参数顺序为装饰器从下到上

class TestTegcloudOwnScenePullHandle(object):

    @mock.patch.object(HttpRequestHandle, "only_request")
    @mock.patch.object(TegcloudOwnScenePullHandler, "get_dimensions")
    def test_get_data_err(self, ins_get_dimensions, ins_only_request):
        ins_get_dimensions.return_value = (0, [])
        ins_only_request.return_value = (
            404, "接口异常"
        )

模拟aiohttp请求

目前GET请求是可以的,但是如果想模拟POST并携带body目前还没发现可行方案(make_mocked_request 没有body等参数)

from aiohttp.test_utils import make_mocked_request

class TestViewDataHandler(unittest.TestCase):

  def test_get_health_res(self, mock_verify_url):
  # 构造请求参数
        request = make_mocked_request('GET', '/health',
                                      headers={'msg_signature': 'signature'})

Pytest mock相同函数

class TestXXXclass(unittest.TestCase):  
    def test_func(self, scene_map_db_ins):
      scene_map_db_ins.side_effect = [[{"xx": "123", "id": 21}],
                                      [{"xx": "124", "id": 20}]]

Mock 异常

        # 调用方法并捕获异常,在with内调用方法
        with self.assertRaises(KeyError):
            ins = test1(a=["123"],
                       b="2023-10-12 12:00:00",
                       c="2023-10-22 13:00:00",
                       d=s,
                       e=False)

本文作者:朝圣

本文链接:www.zh-noone.cn/2023/5/Python单测各种模拟的使用

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

MRO类继承先后的异常
0 条评论