Как смоделировать вызов функции в методе ресурсов flask-restul - PullRequest
0 голосов
/ 03 декабря 2018

Я разработал API, используя Flask-restful.У меня есть API с ресурсом под названием «Сервер».Этот ресурс имеет метод get для обработки запроса к URL-адресу '/ server'.В этом методе у меня есть метод вызова другого класса 'Connector', который получает данные из другого сервиса:

 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 ()' в тесте?

Спасибо.

1 Ответ

0 голосов
/ 05 декабря 2018

Я нашел решение.Чтобы смоделировать вызов метода в другом методе, мы можем использовать декоратор «patch» из 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):
     ...
...