Python юнит-тестирование flask_restful - RequestParser - PullRequest
1 голос
/ 02 марта 2020

Я пишу API в Python и использую Flask -RESTFul . У меня есть Login метод, который получает Email и Password в качестве параметров запроса, оба обязательны:

class Login(Resource):

    def __init__(self):
        self.parser = reqparse.RequestParser()
        self.parser.add_argument('email', required=True)
        self.parser.add_argument('password', required=True)

Код работает просто отлично , Если я пытаюсь выполнить запрос через Postman без параметров запроса, Flask -RESTFul отправляет сообщение об ошибке, в котором указываются поля E-mail и Password.

Теперь я хочу написать для этого модульный тест. На самом деле тест должен быть довольно простым:

@mock.patch('flask_restful.reqparse.RequestParser.parse_args')
class TestLoginMethods(unittest.TestCase):

    def test_post_body_missing(self, parse_args):
        self.login = Login()
        self.login.post()
        # TODO: should assert error when Email and Password not found in request

Проблема здесь в том, что parse_args подвергается насмешке, а функциональность Flask -RESTFul, вызывающая ошибку для обязательных полей, отсутствует. Это означает, что ошибка не будет возвращена, если адрес электронной почты и пароль не были предоставлены . Как мне заглушить эту функциональность RequestParser? Я новичок в python, я мог найти только примеры без Flask -RESTFul.

1 Ответ

0 голосов
/ 03 марта 2020

Чтобы в тесте работало parse_args, обязательно надо высмеивать глобальные request и current_app из flask

@mock.patch('flask_restful.reqparse.request')
@mock.patch('flask_restful.reqparse.current_app')
class TestLoginMethods(unittest.TestCase):
    def setUp(self):
        self.login = Login()

    def tearDown(self):
        pass

    def test_post_request_without_email(self, mock_request, mock_current_app):
        try:
            self.login.post()
        except Exception as e:
            self.assertTrue(isinstance(e, BadRequest))
            self.assertEqual(e.data['message']['email'], 'Missing required parameter in the JSON body or the post '
                                                         'body or the query string')
...