I am writing a test for my Flask app that uses Flask-SQLAlchemy. In models.py
, I used db = SQLAlchemy()
, and wrote a function to configure it with the app. But when I run my test, I get the error "RuntimeError: A 'SQLAlchemy' instance has already been registered on this Flask app". I'm not sure where the test file is creating a new instance of SQLAlchemy.
# flaskr.py
from flask import Flask
from models import setup_db
def create_app(test_config=None):
app = Flask(__name__)
setup_db(app)
return app
# models.py
from flask_sqlalchemy import SQLAlchemy
database_path = "postgresql://student:student@localhost/bookshelf"
db = SQLAlchemy()
def setup_db(app, database_path=database_path):
app.config["SQLALCHEMY_DATABASE_URI"] = database_path
db.init_app(app)
with app.app_context():
db.create_all()
# test_flaskr.py
import unittest
from flaskr import create_app
from models import setup_db
class BookTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app()
self.client = self.app.test_client()
setup_db(self.app, "postgresql://student:student@localhost/bookshelf_test")
with self.app.app_context():
self.db = SQLAlchemy()
self.db.init_app(self.app)
self.db.create_all()
def test_get_paginated_books(self):
res = self.client.get("/books")
data = res.json
self.assertEqual(res.status_code, 200)
self.assertTrue(data["success"])
self.assertTrue(data["total_books"])
self.assertTrue(len(data["books"]))
When I run the test, I get the following error:
$ python -m unittest -v test_flaskr.py
test_get_paginated_books (test_flaskr.BookTestCase) ... ERROR
======================================================================
ERROR: test_get_paginated_books (test_flaskr.BookTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\swilk\OneDrive\DOCS-Programming\udacity-demo-bookshelf\backend\test_flaskr.py", line 21, in setUp
setup_db(self.app, self.database_path)
File "C:\Users\swilk\OneDrive\DOCS-Programming\udacity-demo-bookshelf\backend\models.py", line 24, in setup_db
db.init_app(app)
File "C:\Users\swilk\OneDrive\DOCS-Programming\udacity-demo-bookshelf\env\lib\site-packages\flask_sqlalchemy\extension.py", line 253, in init_app
raise RuntimeError(
RuntimeError: A 'SQLAlchemy' instance has already been registered on this Flask app. Import and use that instance instead.
----------------------------------------------------------------------
Ran 1 tests in 0.226s
FAILED (errors=1)
source https://stackoverflow.com/questions/75523569/runtimeerror-a-sqlalchemy-instance-has-already-been-registered-on-this-flask
Comments
Post a Comment