我对单元测试和RESTful API开发都比较陌生。我想知道如何对Flask Restful中的Resource类中的函数进行单元测试?我可以对端点的响应进行单元测试,但是我不知道如何对端点控制器类内的单个函数进行测试。
下面是我的应用程序代码。它包括3个文件,包括测试:
- api.py
- controller_foo.py
- test_controller_foo.py
# api.py
from flask import Flask
from flask_restful import Api
from .controller_foo import ControllerFoo
def create_app(config=None):
app = Flask(__name__)
app.config['ENV'] ='development'
return app
application = app = create_app()
api = Api(app)
api.add_resource(ControllerFoo, '/ctrl')
if __name__ == "__main__":
app.run(debug=True)
# controller_foo.py
from flask_restful import Resource
from flask import request
class ControllerFoo(Resource):
"""
basically flask-restful's Resource method is a wrapper for flask's MethodView
"""
def post(self):
request_data = self.handle_request()
response = self.process_request(request_data)
return response
def handle_request(self):
json = request.get_json()
return json
def process_request(self, data):
# do some stuffs here
return {'foo': 'bar'}
我正在使用 unittest
# test_controller_foo.py
import unittest
from api import app
from .controller_foo import ControllerFoo
# initiating class to try testing but I don't know how to start
ctrl = ControllerFoo()
class ControllerFooTestCase(unittest.TestCase):
def setUp(self):
self.app = app
self.app.config['TESTING'] = True
self.client = app.test_client()
self.payload = {'its': 'empty'}
def tearDown(self):
pass
def test_get_response(self):
response = self.client.post('/ctrl', json=self.payload)
expected_resp = {
'foo': 'bar'
}
self.assertEqual(response.status_code, 200)
self.assertDictEqual(response.get_json(), expected_resp)
if __name__ == "__main__":
unittest.main()
我想知道如何正确地为handle_request
和process_request
函数进行单元测试。
编辑:修复我的有错误的代码。感谢Laurent LAPORTE的指导。
handle_request
和process_request
函数进行单元测试,我可以使用```with self.app.test_request_context('/ctrl'): # code here要测试ControllerFoo类内部的函数,我可以创建该类的实例,然后直接调用函数。目前这种方法满足我的需求。
- addicted