Testing 在使用peewe和PyTest测试烧瓶安全性时,DB不改变
我刚刚开始用pytest测试我的flask应用程序,它基本上按照预期工作。不幸的是,测试使用的是实时数据库,而不是模拟数据库。我很确定这与事实有关,flask security使用peewee的database_包装器,而不是“简单”的数据库 这里有一些代码。这是来自测试:Testing 在使用peewe和PyTest测试烧瓶安全性时,DB不改变,testing,flask,peewee,flask-security,Testing,Flask,Peewee,Flask Security,我刚刚开始用pytest测试我的flask应用程序,它基本上按照预期工作。不幸的是,测试使用的是实时数据库,而不是模拟数据库。我很确定这与事实有关,flask security使用peewee的database_包装器,而不是“简单”的数据库 这里有一些代码。这是来自测试: @pytest.fixture def client(): db_fd, belavoco_server.app.config['DATABASE'] = { 'name': 'userLogin_TEST.db',
@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\u test.db
。我想这是因为bv_user_model.py
中的db_包装器——但我没有找到改变这种行为的方法。任何帮助都将不胜感激 问题的根源似乎是在bv_用户_模型中:
app.config['DATABASE'] = {
'name': 'userLogin.db',
'engine': 'peewee.SqliteDatabase',
}
由于您正在对具有生产凭据的应用程序使用FlaskDB
,因此db_包装器似乎会“记住”这一点,并且不会被您的测试覆盖
最直接的答案是不要使用你的应用程序直接创建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):
...
你的例子是不可复制的,这可能是这个问题没有得到足够重视的原因。夹具似乎格式错误(无缩进)。什么是belavoco_服务器?另外,我想问一下,将字典键解包到
db\u fd和belavoco\u server.app.config['DATABASE']
中的目的是什么?这对我来说没有任何意义,因为db_df
将是一个字符串,而不是一个文件描述符。你是对的,这个问题问得不好,但我真的被这个问题弄糊涂了,因为代码本身是有效的,而且我对测试是新手belavoco_server
是整个项目的名称,应用程序在其中创建。你是对的,解包毫无意义,它来自之前的代码,它使用tempfile.mkstemp()
创建一个临时文件,返回一对。毕竟,我找到了一个解决方案,使用相同的BaseModel并使用一个临时文件初始化数据库,就像我在其他测试中所做的那样。因为flask安全性的示例使用了数据库包装器,所以我认为必须使用FlaskDB。没有它,一切都很好。谢谢你,你解决了问题。与此同时,我自己找到了一个解决方案,抛弃了FlaskDB,返回到一个基本模型,使用database.init(database_name)
ifnot app.config['TESTING']
。这是所有其他测试的工作原理,但是(正如我在上面的评论中所解释的)我认为我必须使用db_包装来使用flask安全性。我从未使用peewee和flask手动打开和关闭连接。显然,FlaskDB是为你做的。我已经使用了一段时间的peewee,从来没有任何不关闭连接的问题,我总是假设它们是自动关闭的。当使用模型时,很明显,连接是开放的。我应该在请求结束时使用钩子关闭它吗?