testing - 如何在flask-restul资源方法中模拟函数调用
问题描述
我使用 Flask-restful 开发了一个 API。我有一个名为“服务器”的资源的 API。这个资源有一个方法 get 来处理对'/server' url 的请求。在这种方法中,我有一个从另一个服务获取数据的另一个类“连接器”的调用方法:
class Server(Resource):
def get(self):
...
status, body = connector.get_servers(page, size) # call method of another class
...
return body, status
我想测试开发的 API。我写了一些测试:
from application import create_app
from unittest import TestCase
class TestServerResource(TestCase):
def setUp(self):
self.app = create_app()
self.client = self.app.test_client
def test_bad_url(self):
res = self.client().get('/server')
self.assertEqual(res.status_code, 400)
# Test of get method Server resources described above
def test_pagination(self):
res = self.client().get('/server?page=1&size=1') # request to my API
self.assertEqual(res.status_code, 200)
在方法'test_pagination'中,我正在测试我的资源的方法'get',但是在这个方法中调用了另一个类的方法。因此我有一个问题:如何在测试中模拟“connector.get_servers()”的调用?
谢谢。
解决方案
我找到了解决方案。要在其他方法中模拟方法调用,我们可以使用 unittest.mock 中的“补丁”装饰器
例如下面描述的例子,它看起来如下:
from unittest.mock import patch
# Test of get method Server resources described above
@patch('path_to_method_we_want_to_mock.method')
def test_pagination(self, mock):
mock.return_value = <new value> # set value which mocked method return
res = self.client().get('/server?page=1&size=1') # request to my API
self.assertEqual(res.status_code, 200)
现在在方法 get() 中调用 get_servers 方法将返回 mock.return_value。
也可以使用一些补丁装饰器:
@patch('application.servers_connector.ServersConnector.get_server_by_id')
@patch('application.rent_connector.RentConnector.get_rents_for_user')
def test_rent_for_user(self, rent_mock, server_mock):
...
推荐阅读
- cmake - 在 Mac 上设置 VulkanGuide 教程
- javascript - 在 jsplumb 社区版中需要帮助以拖放不同的操作组件
- android - 将 layout_height 更改为“wrap_content”会缩小组件
- excel - excel时间少于3小时条件格式
- java - java处理将unicode char替换为square
- java - 在后台服务的系统叠加层中显示横幅/原生广告
- android - 从 Firebase 获取空字符串
- asp.net - 实例失败错误 SQLServer Asp Net Core
- nginx - 如何使用两个后端处理 Kubernetes 入口规则
- css - 在使用材料 ui 样式的反应 js 中是否有头部重复样式的解决方案?