Flask 单元测试和 Flask 安全性也有问题
Flask unittest and flask security too issue
我也有带有 Flask 安全性的简单 Flask 应用程序和一些单元测试。
test.py:
class UserModelCase(unittest.TestCase):
def setUp(self):
self.app = create_app(TestConfig)
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
app/init.py
db = SQLAlchemy()
admin = Admin(name='abcd', template_mode='bootstrap4')
security = Security()
def create_app(config_class=Configuration):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
fsqla.FsModels.set_db_info(db)
from app.models import User, Role, Comment, Post
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security.init_app(app, user_datastore, register_form=ExtendedRegisterForm)
...
return app
和一些测试。
任何测试都有效,但是如果我 运行 所有测试都在第二个我有一个错误:
sqlalchemy.exc.InvalidRequestError: Table 'roles_users' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
在 self.app = create_app(TestConfig)
但在我的例子中,我没有定义 table“roles_users”,它是自动创建的,我没有在 models.py 中定义“roles_users” ]
我怎样才能 运行 所有测试都避免错误?请帮助我
这里的主要问题是您需要为每个测试创建一个新的数据库实例 - 因为在 create_app() 中您正在做 db.init(app) - 这可能是事情所在失败。
这也可能适用于您的安全和管理对象。
尝试不使用 create_app() 并在您的测试装置 Setup() 中执行等效操作
谢谢,jwag。感谢您的指导,经过一番思考后我添加到测试类中。它帮助了
@classmethod
def setUpClass(cls) -> None:
cls.app = create_app(TestConfig)
我也有带有 Flask 安全性的简单 Flask 应用程序和一些单元测试。
test.py:
class UserModelCase(unittest.TestCase):
def setUp(self):
self.app = create_app(TestConfig)
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
app/init.py
db = SQLAlchemy()
admin = Admin(name='abcd', template_mode='bootstrap4')
security = Security()
def create_app(config_class=Configuration):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
fsqla.FsModels.set_db_info(db)
from app.models import User, Role, Comment, Post
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security.init_app(app, user_datastore, register_form=ExtendedRegisterForm)
...
return app
和一些测试。 任何测试都有效,但是如果我 运行 所有测试都在第二个我有一个错误:
sqlalchemy.exc.InvalidRequestError: Table 'roles_users' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
在 self.app = create_app(TestConfig)
但在我的例子中,我没有定义 table“roles_users”,它是自动创建的,我没有在 models.py 中定义“roles_users” ]
我怎样才能 运行 所有测试都避免错误?请帮助我
这里的主要问题是您需要为每个测试创建一个新的数据库实例 - 因为在 create_app() 中您正在做 db.init(app) - 这可能是事情所在失败。
这也可能适用于您的安全和管理对象。
尝试不使用 create_app() 并在您的测试装置 Setup() 中执行等效操作
谢谢,jwag。感谢您的指导,经过一番思考后我添加到测试类中。它帮助了
@classmethod
def setUpClass(cls) -> None:
cls.app = create_app(TestConfig)