【问题标题】:How to mock function call in flask-restul resource method如何在flask-restful资源方法中模拟函数调用
【发布时间】:2018-12-03 09:26:31
【问题描述】:

我使用 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()”的调用?

谢谢。

【问题讨论】:

    标签: testing flask mocking flask-restful


    【解决方案1】:

    我找到了解决办法。 要在其他方法中模拟方法调用,我们可以使用 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):
         ...
    

    【讨论】:

    • 我测试了这个流程,它不适合我。我有一个网址“/create_vm/”。这个 url 喜欢方法 create_vm。在这个 create_vm 方法中,我调用了 run_command 方法。写在下面的代码来模拟 run_command, @patch('app.vm_create.utility.run_command') def test_vm_create_negative3(self, run_command_mock): run_command_mock.return_value = True, "response123456"。 以上不工作。你能帮我解决这个问题吗?它仍在调用 run_command 方法。它没有考虑模拟响应。
    • 当我在测试函数中调用此函数“run_command”时,它返回的是模拟结果,但不在 url 函数“create_vm”中
    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 2014-09-25
    • 2020-03-03
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多