Как протестировать Flask API, использующий аргументы контекста - PullRequest
1 голос
/ 09 октября 2019

Я довольно новичок в программировании, и я заблокирован, пытаясь создать модульный тест для этого приложения, это довольно просто:

from flask import Flask, request,jsonify,make_response

app = Flask(__name__)


@app.route('/header')
def my_route():
    text = request.args.get('text')
    tag = request.args.get('tag',default=0,type=int)
    if text.find('.')==-1:
        if tag==0:
            return jsonify(header=text.title())
        else:          
            return jsonify(header= '<h' + str(tag) + '>' + text.title() + '</h' + str(tag) + '>' ) # HTML TAG
    else:
        return make_response(jsonify(error='Dots are not allowed in headers'),400) #BAD REQUEST ERROR 400


if __name__ == '__main__':
     app.run(debug=True, host='0.0.0.0')

Я пробовал что-то вроде этого:

from main import app
from flask import json

def test_my_route():        
    response = app.test_client().get(
        '/header?text=Hello',
    )

    assert response.status_code == 200

Но это не работает, кажется, проблема в том, что я использую контекстные аргументы для строки запроса, а не фактические функции. Могу ли я получить какую-либо помощь в этом?

Спасибо!

1 Ответ

0 голосов
/ 10 октября 2019

Возможно, проблема в том, что вы пытаетесь запустить тестовый клиент вне контекста его приложения.

Попробуйте обернуть ваш вызов в контекст приложения:

def test_my_route(): 

    with app.app_context():

        response = app.test_client().get(
            '/header?text=Hello',
        )

        assert response.status_code == 200

Есливы используете пакет unittest, тогда лучше всего включить его в свои настройки - это мои setUp и tearDown функции для моих BaseTestClass, от которых наследуются все остальные мои модульные тесты (create_app - это просто моя обычная фабрика приложений, вы можете просто импортировать app из вашего другого модуля):

from unittest import TestCase
from app.application import create_app, db

class BaseTestCase(TestCase):

    def setUp(self):

        self.app = create_app()
        self.db = db

        self.app.config['TESTING'] = True

        self.app_context = self.app.app_context()
        self.app_context.push()
        self.client = self.app.test_client()

    def tearDown(self):

        self.db.session.remove()
        self.db.get_engine(self.app).dispose()
        self.app_context.pop()
...