如何对需要HTTP请求的功能进行单元测试?

时间:2020-08-11 09:35:52

标签: python unit-testing flask

我的Flask应用程序中有一些基于会话管理的功能。例如,当来自会话的请求传入时,将更新字典中的值(datetime.now()值)。

def update_existing_session(active_sessions):
    """[Updates the value of the session in the management dictionary with
    a current timestamp]

    Args:
        active_sessions ([dictionary]): [Dictionary containing session info.
        key = session token, value = last request timestamp]

    Returns:
        active_sessions ([dictionary]): [Updated dictionary of active sessions.
        Key = session token, value = last request timestamp]
    """
    session_name = session.get('public_user')
    logging.info("New request from " + str(session_name))
    active_sessions[session_name] = datetime.now()
    return active_sessions

当我尝试对此单元进行测试或使用会话的类似方法(例如下面的示例)时,出现以下错误:

    def test_generate_new_session(self):
        active_sessions = {}
        active_sessions = session_management.generate_new_session(active_sessions)
        self.assertEqual(len(active_sessions), 1)
 

RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that needed
an active HTTP request.  Consult the documentation on testing for
information about how to avoid this problem.

如何使用活动的HTTP请求进行单元测试,以生成会话以便代码运行?

1 个答案:

答案 0 :(得分:1)

您要使用Flask的test client

from your_flask_app import app   # Flask app object


with app.test_client() as client:
    response = client.get('/your-controller-endpoint')
    response = client.post('/your-controller-endpoint', data={'post': 'params'})

Flask文档通常建议您使用PyTest,这将使您更轻松地设置固定装置。来自文档的示例:

import os
import tempfile

import pytest

from flaskr import flaskr


@pytest.fixture
def client():
    db_fd, flaskr.app.config['DATABASE'] = tempfile.mkstemp()
    flaskr.app.config['TESTING'] = True

    with flaskr.app.test_client() as client:
        with flaskr.app.app_context():
            flaskr.init_db()
        yield client

    os.close(db_fd)
    os.unlink(flaskr.app.config['DATABASE'])

但是简单的答案是,只需在您的test_client()对象上调用app

相关问题