testing - 使用 peewe 和 PyTest 测试 Flask-Security 时数据库没有改变

标签 testing flask peewee flask-security

我刚刚开始使用 pytest 测试我的 Flask 应用程序,它基本上按预期工作。不幸的是,该测试使用实时数据库而不是模拟数据库。我很确定这与 flask-security 使用 peewee 的 database_wrapper 而不是“直接”数据库这一事实有关。

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

@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 会“记住”这一点并且不会被您的测试覆盖。

最直接的答案是不使用您的应用直接创建 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):
    ...

关于testing - 使用 peewe 和 PyTest 测试 Flask-Security 时数据库没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55140795/

相关文章:

javascript - 尝试切换到对模板使用继承,但格式总是搞砸

python-3.x - 在 https 服务器上提供 Flask-RESTPlus

python - 在 GAE 中对基于 NDB 的 Flask 应用程序进行单元测试时,put() 抛出错误

python - MYSQL PeeWee 无需 RawQuery 的完全连接

python - 如何在 Union peewee orm 中对 SQL 结果进行排序

testing - 如何组织和测试这段代码?

testing - 一般定义测试过程

javascript - 用 mocha 测试异步函数

python - Google App Engine 上的 PeeWee + SQLite3

node.js - Travis CI 没有使用正确的 node.js 版本