使用 peewe 和 PyTest 测试 Flask-Security 时数据库没有改变
DB not changing when testing Flask-Security with peewe and PyTest
我刚刚开始使用 pytest 测试我的 Flask 应用程序,它基本上按预期工作。不幸的是,该测试使用实时数据库而不是模拟数据库。我很确定这与 flask-security 使用 peewee 的 database_wrapper 而不是 "straightforward" 数据库这一事实有关。
这是一些代码。这是来自测试:
@pytest.fixture
def client():
db_fd, belavoco_server.app.config['DATABASE'] = { 'name': 'userLogin_TEST.db',
'engine': 'peewee.SqliteDatabase' } }
belavoco_server.app.config['TESTING'] = True
client = belavoco_server.app.test_client()
#this seems not to help at all
with belavoco_server.app.app_context():
belavoco_server.users.user_managment.db_wrapper.init_app(belavoco_server.app)
yield client
os.close(db_fd)
os.unlink(belavoco_server.app.config['DATABASE'])
这是我的一些代码 bv_user_model.py
app.config['DATABASE'] = {
'name': 'userLogin.db',
'engine': 'peewee.SqliteDatabase',
}
app.config['SECURITY_URL_PREFIX'] = "/users"
# Create a database instance that will manage the connection and
# execute queries
db_wrapper = FlaskDB(app)
class Role(db_wrapper.Model, RoleMixin):
name = CharField(unique=True, default="standard")
description = TextField(null=True)
def __repr__(self):
return self.name
执行测试时,Flask 使用 userLogin.db
而不是 userLogin_TEST.db
。我想这是因为 bv_user_model.py
中的 db_wrapper - 但我没有找到改变这种行为的方法。任何帮助将不胜感激!
问题的根源似乎在 bv_user_model:
app.config['DATABASE'] = {
'name': 'userLogin.db',
'engine': 'peewee.SqliteDatabase',
}
由于您将 FlaskDB
与具有生产凭据的应用程序一起使用,因此 db_wrapper 似乎 "remember" 不会被您的测试覆盖。
最直接的答案是不使用您的应用直接创建 FlaskDB 实例
db = FlaskDB()
稍后在您的应用程序上对其进行初始化
from models import db
def create_app():
app = ...
app.config["DATABASE"] = ...
db.init_app(app)
...
return app
这会让你有一个像这样的单独的函数,你可以用它来进行测试。
def create_test_app():
app = ...
app.config["DATABASE"] = ...test credentials...
db.init_app(app)
...
return app
并且当您创建模型时,使用 FlaskDB 实例就像您已经使用的一样。
db = FlaskDB()
class Role(db.Model, RoleMixin):
...
我刚刚开始使用 pytest 测试我的 Flask 应用程序,它基本上按预期工作。不幸的是,该测试使用实时数据库而不是模拟数据库。我很确定这与 flask-security 使用 peewee 的 database_wrapper 而不是 "straightforward" 数据库这一事实有关。
这是一些代码。这是来自测试:
@pytest.fixture
def client():
db_fd, belavoco_server.app.config['DATABASE'] = { 'name': 'userLogin_TEST.db',
'engine': 'peewee.SqliteDatabase' } }
belavoco_server.app.config['TESTING'] = True
client = belavoco_server.app.test_client()
#this seems not to help at all
with belavoco_server.app.app_context():
belavoco_server.users.user_managment.db_wrapper.init_app(belavoco_server.app)
yield client
os.close(db_fd)
os.unlink(belavoco_server.app.config['DATABASE'])
这是我的一些代码 bv_user_model.py
app.config['DATABASE'] = {
'name': 'userLogin.db',
'engine': 'peewee.SqliteDatabase',
}
app.config['SECURITY_URL_PREFIX'] = "/users"
# Create a database instance that will manage the connection and
# execute queries
db_wrapper = FlaskDB(app)
class Role(db_wrapper.Model, RoleMixin):
name = CharField(unique=True, default="standard")
description = TextField(null=True)
def __repr__(self):
return self.name
执行测试时,Flask 使用 userLogin.db
而不是 userLogin_TEST.db
。我想这是因为 bv_user_model.py
中的 db_wrapper - 但我没有找到改变这种行为的方法。任何帮助将不胜感激!
问题的根源似乎在 bv_user_model:
app.config['DATABASE'] = {
'name': 'userLogin.db',
'engine': 'peewee.SqliteDatabase',
}
由于您将 FlaskDB
与具有生产凭据的应用程序一起使用,因此 db_wrapper 似乎 "remember" 不会被您的测试覆盖。
最直接的答案是不使用您的应用直接创建 FlaskDB 实例
db = FlaskDB()
稍后在您的应用程序上对其进行初始化
from models import db
def create_app():
app = ...
app.config["DATABASE"] = ...
db.init_app(app)
...
return app
这会让你有一个像这样的单独的函数,你可以用它来进行测试。
def create_test_app():
app = ...
app.config["DATABASE"] = ...test credentials...
db.init_app(app)
...
return app
并且当您创建模型时,使用 FlaskDB 实例就像您已经使用的一样。
db = FlaskDB()
class Role(db.Model, RoleMixin):
...