testing - 如何在 flask-restful 资源方法中模拟函数调用

标签 testing flask mocking flask-restful

我使用 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):
     ...

关于testing - 如何在 flask-restful 资源方法中模拟函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53590758/

相关文章:

python - 如何将 pytest 与子进程一起使用?

python - 生成器返回失败的 Mocks assert_called_with

ios - 是否可以在静态方法中 OCMock 类调用?

python - Flask_restful导入资源错误

python - 组合 Flask、Bootstrap 和 Dash 应用程序

jquery - 通过 jquery 提交表单后 Flask 重定向不起作用

c++ - 在 C++ 中将模拟对象转换为它们的抽象基类

jquery - 如何使用 qunit 比较 serializeArray 的输出

php - 在 Symfony2 中创建一个假用户用于测试目的

selenium - 区分测试用例类型