Python单元测试flask_restful-RequestParser

问题描述 投票:1回答:1

我正在用Python编写API,并且正在使用Flask-RESTFul。我有一个Login方法,该方法接收EmailPassword作为请求参数,两者都是必需的:

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将发送响应错误,指出“电子邮件”和“密码”为必填字段。

现在我要为此编写单元测试。测试实际上应该非常简单:

@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的示例。

python flask flask-restful
1个回答
0
投票

parse_args必须在测试中工作,是要模拟request中的全局current_appflask

@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')
© www.soinside.com 2019 - 2024. All rights reserved.