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)