我正在尝试为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相关的东西,这些单元测试的重点是将我的代码路径作为完整性检查,而不仅仅是发生什么。
答案 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的库,例如Chakram或Frisby