我正在用Python编写API,并且正在使用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将发送响应错误,指出“电子邮件”和“密码”为必填字段。
现在我要为此编写单元测试。测试实际上应该非常简单:
@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的示例。
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')