使用peewe和PyTest测试Flask-Security时数据库未更改

时间:2019-03-13 11:25:58

标签: 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引起的-但我没有找到改变此行为的方法。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

问题的根源似乎是在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):
    ...