在Flask应用和模拟Flask.request.json周围进行正确的单元测试?

时间:2019-06-24 23:18:06

标签: python unit-testing flask

我正在尝试为Flask应用程序(用于处理某些RESTful端点的微服务)中包含的文件编写单元测试。我遇到的一些问题:我似乎发现的所有文档和问题都涉及调用API本身,这是不正确的,我需要直接使用我已设置的模拟假请求直接调用post函数测试功能。

我能够尝试模拟request.json对象,但是我总是遇到“ RuntimeError:在请求上下文之外工作”。我试图使用test_request_context(),但这导致了同样的问题。然后我开始更深入地研究Flask并尝试使用app.test_client(),但是这有其自身的问题,除了直接调用端点之外,并且不允许我对功能进行单元测试,它们开始进入集成测试领域。

这是我要测试的功能:

@api.route...
class HandleRoute(Resource):
    @authentication #<-- I want to Mock True or False response
    def post(self): #<-- I want to call directly 
          try:
              if not request.json #<-- Value I want to mock, from flask.request

我应该如何处理?我试图避免再次使用app.test_client()和其他Flask相关的东西,这些单元测试的重点是将我的代码路径作为完整性检查,而不仅仅是发生什么。

1 个答案:

答案 0 :(得分:1)

您想实际执行请求并测试收到的响应是正确的。这是正确的方法,Flask已经有一个内置的客户端可以简化此操作。

官方文档已经包含如何执行此操作的示例(Testing Flask Applications)。如果您想对正在处理的request有更多控制权,请查看Manually push a context

我相信您正在寻找以下代码段(改编自this answer):

with app.test_client() as client:
    resp = client.post('/route', {'some_key': 'some_data'})

如果您想摆脱flask.test_client(),可以使用python-requests保留在python世界中,甚至可以使用基于JavaScript的库,例如ChakramFrisby