Flask 单元测试和 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:已经为此元数据实例定义了表“roles_users”。指定 'extend_existing=True' 以重新定义现有 Table 对象上的选项和列。

self.app = create_app(TestConfig)

但就我而言,我没有定义表“roles_users”,它是自动创建的,我的models.py 中没有定义“roles_users”

我如何运行所有测试以避免错误?请帮帮我

解决方法

这里的主要问题是您需要为每个测试创建一个新的数据库实例 - 因为在 create_app() 中您正在执行 db.init(app) - 这可能是事情失败的地方。

这可能也适用于您的安全和管理对象。

尽量不使用 create_app() 并在您的测试装置 Setup() 中执行等效操作

,

谢谢,jwag。感谢您的指导,经过深思熟虑后,我将其添加到 testclass 中。它帮助了

@classmethod
def setUpClass(cls) -> None:
    cls.app = create_app(TestConfig)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...