在测试期间使用开发sqlite数据库的Pytest-NoneType对象没有属性drivername



我试图访问在开发服务器上使用的sqlite数据库,但出现以下错误:"NoneType"对象没有属性"drivername">。它既发生在从视图调用业务逻辑的过程中,也发生在调用测试客户端定义(当前已从代码中删除(内的db.create_all((的过程中。

测试文件代码:

import os
import json
import pytest
from flask import Flask
import run
from src.utils.config import TestingConfig
from src.models.user_model import User
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI')
SQLALCHEMY_ECHO = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
@pytest.fixture
def client():
app = run.create_app(TestingConfig)
context = app.app_context()
context.push()
with context:
with app.test_client() as client:
yield client
context.pop()
def test_user_register(client):
user_data = { 
'login': 'login', 
'password': 'password', 
'email': 'email@example.com',
'first_name': 'first_name',
'last_name': 'last_name',
'index': '000000'
}
rv = client.post('/api/v1/users/register', data=json.dumps(user_data), content_type='application/json')

user_data['user_role'] = 2
assert '' == rv.data

创建应用程序代码:

from flask import Flask, current_app
from flask_cors import CORS
from flask_swagger_ui import get_swaggerui_blueprint
from src.utils.config import Config, DevelopmentConfig, ProductionConfig
from src.utils.extensions import db, ma, migrate, cors
from src.views import user_view, task_view, task_submission_view
from src.exceptions import exceptions_view
def create_app(config):
app = Flask(__name__)
app.config.from_object(config)
app.register_blueprint(exceptions_view.handler)
app.register_blueprint(user_view.blueprint, url_prefix='/api/v1/users')
app.register_blueprint(task_view.blueprint, url_prefix='/api/v1/tasks')
app.register_blueprint(task_submission_view.blueprint, url_prefix='/api/v1/taskSubmissions')
swagger_blueprint = get_swaggerui_blueprint('/swagger', '/static/swagger.json')
app.register_blueprint(swagger_blueprint)
db.init_app(app)
ma.init_app(app)
migrate.init_app(app, db)
cors.init_app(app)
return app

.env片段:

SQLALCHEMY_DATABASE_URI = "sqlite:///sqlite.db"

答案:

当我从外部脚本创建应用程序时,运行.create_app((,即使蓝图已正确注册,配置在脚本执行后也会被删除。

经过一些尝试和错误运行,我发现通过函数app.config.from_object((配置app是一个问题,更确切地说,在os.getenv((期间,即使将其移动到测试文件中,也无法配置该应用。

解决方案是手动设置配置(在测试文件内部或外部(:app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sqlite.db'

最新更新