我使用Flask-restful开发了一个API。我有一个资源名为“服务器”的API。该资源具有一种方法来处理对“ /服务器” 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()”的调用?
谢谢。
答案 0 :(得分:1)
我找到了解决方案。 要模拟其他方法中的方法调用,我们可以使用unittest.mock中的'patch'装饰器
例如下面所述的示例将以以下方式显示:
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方法将返回模拟值。返回值。
还可以使用某些补丁装饰器:
@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):
...