【问题标题】:Properly Unit test around a Flask App and Mocking Flask.request.json? [duplicate]围绕 Flask App 和 Mocking Flask.request.json 进行正确的单元测试? [复制]
【发布时间】:2023-03-29 17:20:01
【问题描述】:

我正在尝试为包含在烧瓶应用程序(处理一些 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 相关的事情,这些单元测试的重点是检查我的代码路径作为健全性检查,而不仅仅是应该发生的事情。

【问题讨论】:

    标签: python unit-testing flask


    【解决方案1】:

    您希望实际执行请求并测试收到的响应是正确的。这是正确的方法,Flask 已经有一个内置的客户端来简化这件事。

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

    相信你正在寻找以下sn-p(改编自this answer):

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

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

    【讨论】:

    • 谢谢您的回复,有没有办法在模拟请求时直接调用post()?正如我所说,我很犹豫是否要直接通过我的端点,因为我需要模拟 post() 中函数的响应。例如 post() 调用一个已经测试过的处理函数,所以我不关心它需要做的内容或工作,只关心输出。我将模拟来自处理程序的 200 或 500 响应。那么我纯粹是在测试来自 post() 的代码路径以及给定一些请求对象应该返回的内容。
    • 你想要实现的需要test_request_context... 根据flask.pocoo.org/docs/1.0/api/#flask.Flask.test_request_context,你必须在with 块内为request 设置值。
    猜你喜欢
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2013-05-26
    • 2019-01-30
    • 1970-01-01
    • 2017-05-03
    • 2018-03-07
    相关资源
    最近更新 更多