#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.