Конечная точка, возвращающая 404 из Pytest

#python #flask #sqlalchemy #flask-sqlalchemy #pytest

#python #flask #sqlalchemy #flask-sqlalchemy #pytest

Вопрос:

У меня есть API, над созданием которого я работаю test_app.py файл для, но он уже работает полностью и был протестирован через Postman как локально, так и размещенный извне.

Я не могу заставить работать даже свою конечную точку работоспособности, что мешает мне (очевидно) проводить больше тестов и двигаться вперед. Тем не менее, это не сбой теста, он возвращает 404, когда я печатаю переменную, которую я назначаю конечной точке.

test_app.py:

 import os
import unittest
import json
from flask_sqlalchemy import SQLAlchemy
from app import create_app
from models import setup_db, Actor, Movie

class CastingAgencyTestCase(unittest.TestCase):

    def setUp(self):
        self.app = create_app()
        self.client = self.app.test_client
        self.database_name = "casting_test"
        self.database_path = "postgres://{}/{}".format("localhost:5432", self.database_name)
        setup_db(self.app, self.database_path)

        self.new_actor = {
            "name": "Robert DOwney Jr.",
            "age": 45,
            "gender": "male"
        }

        self.new_movie = {
            "title": "Iron Man",
            "release_date": "02/03/2004"
        }
        with self.app.app_context():
            self.db = SQLAlchemy()
            self.db.init_app(self.app)
            self.db.create_all()

    def tearDown(self):
        pass

    def test_health(self):
        res = self.client().get('/')
        print(res)
        data = json.loads(res.data)

        self.assertEqual(res.status_code, 200)
        self.assertIn('health', data)
        self.assertEqual(data['health'], 'App is running.')

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

Вывод этого print(res) является <Response streamed [404 NOT FOUND]> , а затем тест завершается неудачей, потому что в res.data ничего нет, но, конечно, не потому, что страница не найдена.

app.py (до того места, где создается конечная точка работоспособности):

 import os
from flask import Flask, request, abort, jsonify, render_template, 
    redirect, url_for, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
from models import Actor, Movie, setup_db, db_drop_and_create_all, db
from auth import AuthError, requires_auth


def create_app(test_config=None):
    app = Flask(__name__)
    setup_db(app)
    CORS(app, resources={r"/*": {"origins": "*"}})

    # db_drop_and_create_all()

    return app

app = create_app()

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000, debug=True)

# -----------
# @app.routes
# -----------


@app.after_request
def after_request(response):
    response.headers.add('Access-Control-Allow-Headers',
                         'Content-Type, Authorization')
    response.headers.add('Access-Control-Allow-Methods',
                         'GET, POST, PATCH, DELETE, OPTIONS')
    return response


@app.route('/')
def home():
    return jsonify({
        'success': True,
        'health': 'App is running.'
    }), 200
  

models.py (до точки, где создается setup_db):

 import os
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, String, Integer, ForeignKey, Float, Date, Table
from flask_migrate import Migrate

# ---------
# Config.
# ---------

database_path = os.environ.get('DATABASE_URL')
if not database_path:
    database_name = "agency"
    database_path = "postgres://{}:{}@{}/{}".format(
        'postgres', 'root', 'localhost:5000', database_name)

db = SQLAlchemy()


def setup_db(app, database_path=database_path):
    app.config["SQLALCHEMY_DATABASE_URI"] = database_path
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    db.app = app
    db.init_app(app)
  

Найдя несколько видеороликов, касающихся такого рода тестирования, я не могу понять, почему страница может вернуть 404.

Ответ №1:

Решение найдено.

Это было то, что все мои конечные точки (на самом деле, просто весь app.py файл) должен был находиться внутри функции create_app, и в конце файла находится место, где вызывается app = create_app.