БД не изменяется при тестировании Flask-Security с peewe и PyTest - PullRequest
0 голосов
/ 13 марта 2019

Я только что приступил к тестированию своего приложения для колб с помощью pytest, и оно в основном работает как положено.К сожалению, тест использует живую базу данных вместо фиктивной.Я совершенно уверен, что это связано с тем фактом, что защита от флеш-памяти использует peewee's 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,Я полагаю, это из-за db_wrapper в bv_user_model.py - но я не нашел способа изменить это поведение.Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 20 мая 2019

Похоже, корень проблемы в 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):
    ...
...