如何使用应用程序上下文模拟Flask请求

2024-10-03 13:28:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图正确地对我的Flask 1.1.2路由进行单元测试,但并不真正理解有关模拟应用程序上下文的文档

这是我的班级Launch.py

from flask import Flask, request
from LaunchHelper import runController

#Create app
app = Flask(__name__)

@app.route('/write-database',methods=['POST'])
def writeDatabase():
  return runController(request)

以下是我在@Felipe Emirem评论之后的新TestLaunch.py

import unittest
from mock import patch, MagicMock
from flask import request #added
from Launch import app #added

class TestLaunch(unittest.TestCase):

  @patch('Launch.runController')
  def test_writeDatabase(self,runController):

    resp = MagicMock()
    runController.return_value = resp

    with app.test_client() as c:
        ret = c.post('/write-database')

        #assert ret == resp
        runController.assert_called_with(request)

if __name__ == '__main__':
  unittest.main()

我现在可以断言runController是通过直接从Launch.py导入appflask.request调用的,这是有道理的。但我不确定如何确认回复是否正确

此外,我现在得到以下错误:

ERROR in app: Exception on /write-database [POST]
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1953, in full_dispatch_request
  return self.finalize_request(rv)
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1968, in finalize_request
response = self.make_response(rv)
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 2117, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "C:\ProgramData\Anaconda3\lib\site-packages\werkzeug\wrappers\base_response.py", line 269, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
File "C:\ProgramData\Anaconda3\lib\site-packages\werkzeug\wrappers\base_response.py", line 26, in _run_wsgi_app
return app_iter, response[0], Headers(response[1])
IndexError: list index out of range

即使考试通过了

*编辑:这是我更改为使用app.test_context()之前的旧测试类TestLaunch.py

import unittest
from mock import patch, MagicMock
from Launch import writeDatabase

class TestLaunch(unittest.TestCase):

  @patch('Launch.runController')
  @patch('Launch.request')
  def test_writeDatabase(self,request,runController):

    resp = MagicMock()
    runController.return_value = resp

    ret = writeDatabase()

    assert ret == resp
    runController.assert_called_with(request)

if __name__ == '__main__':
  unittest.main()

我在旧版本的flask上运行了这个,它运行得很好,但是现在由于@patch('Launch.request')行,我得到了Working out of request context错误。我试着阅读其他stackoverflow文章和flask文档,但我找不到任何适用于我当前用例的东西


Tags: infrompyimportselfappflaskresponse
1条回答
网友
1楼 · 发布于 2024-10-03 13:28:08

好的,我知道了。只需要使用我在这里读到的test_request_contextlink

这是我的新TestLaunch.py

import unittest
from mock import patch, MagicMock
from flask import request
from Launch import app, writeDatabase

class TestLaunch(unittest.TestCase):

  @patch('Launch.runController')
  def test_writeDatabase(self,runController):
    resp = MagicMock()
    runController.return_value = resp

    with app.test_request_context() as c:
        ret = writeDatabase()

    assert ret == resp
    runController.assert_called_with(request)

if __name__ == '__main__':
  unittest.main()

我不是在测试URL(我本来也不是这样),但是我能够测试flask request对象是否被正确处理

相关问题 更多 >