Testing 在使用peewe和PyTest测试烧瓶安全性时,DB不改变

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测试我的flask应用程序,它基本上按照预期工作。不幸的是,测试使用的是实时数据库,而不是模拟数据库。我很确定这与事实有关,flask security使用peewee的database_包装器,而不是“简单”的数据库

这里有一些代码。这是来自测试:

@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)
if
not app.config['TESTING']
。这是所有其他测试的工作原理,但是(正如我在上面的评论中所解释的)我认为我必须使用db_包装来使用flask安全性。我从未使用peewee和flask手动打开和关闭连接。显然,FlaskDB是为你做的。我已经使用了一段时间的peewee,从来没有任何不关闭连接的问题,我总是假设它们是自动关闭的。当使用模型时,很明显,连接是开放的。我应该在请求结束时使用钩子关闭它吗?