Python 围绕Flask应用程序和Mocking Flask.request.json进行适当的单元测试?

Python 围绕Flask应用程序和Mocking Flask.request.json进行适当的单元测试?,python,unit-testing,flask,Python,Unit Testing,Flask,我正在尝试为一个包含在flask app microservice中的文件编写单元测试,以处理一些RESTful端点。我遇到了一些事情:我发现的所有文档和问题都涉及到调用API本身,这是不合适的,我需要使用模拟的假请求直接调用post函数,因为我需要测试功能 我可以尝试模拟request.json对象,但是我总是遇到运行时错误:在请求上下文之外工作。我尝试使用test_request_上下文,但这会导致相同的问题。然后我开始深入Flask并尝试使用我们的app.test_客户端。然而,除了直接调

我正在尝试为一个包含在flask app microservice中的文件编写单元测试,以处理一些RESTful端点。我遇到了一些事情:我发现的所有文档和问题都涉及到调用API本身,这是不合适的,我需要使用模拟的假请求直接调用post函数,因为我需要测试功能

我可以尝试模拟request.json对象,但是我总是遇到运行时错误:在请求上下文之外工作。我尝试使用test_request_上下文,但这会导致相同的问题。然后我开始深入Flask并尝试使用我们的app.test_客户端。然而,除了直接调用端点之外,这也有它自己的问题,并且不允许我正确地单元测试我的功能,它们开始进入集成测试的领域

这是我正在尝试测试的函数:

@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相关的事情,同样,这些单元测试的目的是检查我的代码路径,作为一种健全性检查,而不仅仅是检查应该发生的事情

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

官方文件已经包含了一个如何做到这一点的示例。如果您想对正在处理的请求有更多的控制权,请查看

我相信您正在寻找以下改编自的片段:


如果您想废除flask.test_客户端,您可以使用python请求留在python世界中,甚至可以使用基于javascript的库,如或

感谢您的响应,在模拟请求时没有直接调用post的方法吗?正如我所说的,我不太愿意直接通过我的端点,因为我需要模拟post中函数的响应。例如,post调用一个已经测试过的处理函数,所以我不关心它需要做的内容或工作,只关心输出。我将模拟处理程序的200或500响应。所以我纯粹是在测试post中的代码路径,以及给定某个请求对象应该返回什么。。。根据,您必须在with块内为您的请求设置值。
with app.test_client() as client:
    resp = client.post('/route', {'some_key': 'some_data'})