烧瓶,蓝图碰撞和Pytest

时间:2018-11-21 08:58:03

标签: python flask pytest

我正在使用Flask蓝图创建应用程序。我正在用pytest测试它。使用test_client在不同状态下生成pytest.fixture会导致蓝图名称冲突。

这是我的Flask __init__代码:

from flask import Flask
from flask_dropzone import Dropzone
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_user import UserManager
from flask_googlemaps import GoogleMaps
import os
from app.settings import app, db

# get extensions
dropzone = Dropzone()
google_maps = GoogleMaps()
migrate = Migrate()

def create_app(config_class=Config):

    # initialise extensions
    google_maps.init_app(app)
    dropzone.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)

    # FLASK-User Stuff
    from app.models import User
    user_manager = UserManager(app, db, User)

    from app.errors import bp as errors_bp
    app.register_blueprint(errors_bp)

    from app.main import bp as main_bp
    app.register_blueprint(main_bp)

    return app

然后,我尝试使用多个pytest测试应用程序的不同方面。我为每个人创建一个pytest.fixture来生成一个test_client。例如,我正在创建两个测试夹具,以测试处于不同状态的数据库的应用程序。

例如。

@pytest.fixture(scope='module')
def client_state1():
    app = create_app()
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' + PATH_TO_DB_STATE_1
    app.config['TESTING'] = True
    client = app.test_client()
    ctx = app.app_context()
    ctx.push()

    yield client

    ctx.pop()

@pytest.fixture(scope='module')
def client_state2():
    app = create_app()
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' + PATH_TO_DB_STATE_2
    app.config['TESTING'] = True
    client = app.test_client()
    ctx = app.app_context()
    ctx.push()

    yield client

    ctx.pop()


def test_with_state1(client_state1):
"""Test should pass"""
assert 1 == 1

def test_with_state2(client_state2):
"""Test should pass"""
assert 1 == 1

运行测试时,出现以下错误。

AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x1a16b5d4e0> and <flask.blueprints.Blueprint object at 0x1a1633f6a0>.  Both share the same name "googlemaps".  Blueprints that are created on the fly need unique names.

我尝试过将测试分成多个单独的文件,并将灯具的范围设置为起作用。但无济于事。在所有情况下,第一个测试通过,第二个导致碰撞。我在做什么错了?

0 个答案:

没有答案