在Flask中使用内存中的sqlite db进行单元测试

问题描述 投票:0回答:1

完整代码托管于here 目的是使用内存中的 sqlite 数据库进行测试。但是我的开发实例数据库正在使用。因为我可以发现我的数据在开发数据库中被删除。

我的

tests\BaseCase.py
如下:

import sys
sys.path.append('..')
from app import create_app
from app.exts import db

import unittest

class BaseCase(unittest.TestCase):
    def setUp(self):
        self.app = create_app()
        self.app.config.from_object('config.TestConfig')
        self.client = self.app.test_client(self)

        self.app_ctxt = self.app.app_context()
        self.app_ctxt.push()        
        db.create_all() # < --- update

    def tearDown(self):
        db.session.remove()
        db.drop_all() # < --- update        
        self.app_ctxt.pop()        
        self.app = None        
        self.app_ctxt = None 

if __name__ == '__main__':
    unittest.main()

我的

config.py
如下:

import os

class BaseConfig(object):
    SECRET_KEY = 'o\xadlT\x97\x82\x1e[\xc6aeFv\x90\xdc\xcc'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class TestConfig(BaseConfig):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'

class DevelopmentConfig(BaseConfig):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db'

class ProductionConfig(BaseConfig):
    DEBUG = False

app\exts.py
如下:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

app\__init__.py
如下:

from flask import Flask

from flask_restx import Api
from flask_migrate import Migrate

from flask_jwt_extended import JWTManager
from flask_cors import CORS

from app.models import User
from app.exts import db
from flask_marshmallow import Marshmallow

from app.resources.auth import auth_namespace
from app.resources.reset_password import reset_password_namespace
from app.resources.task import task_namespace

def create_app():
    app = Flask(__name__)
    # Configuration
    ma = Marshmallow(app)
    app.config.from_object('config.DevelopmentConfig')

    db.init_app(app)

    Migrate(app, db)

    JWTManager(app)
    CORS(app)

    api = Api(app, title='Authentication API', doc='/')
    api.add_namespace(auth_namespace, path='/api/auth')
    api.add_namespace(reset_password_namespace, path='/api/')
    api.add_namespace(task_namespace, path='/api/task')

    @app.shell_context_processor
    def make_shell_context():
        return { 'db': db, 'User': User }

    return app

我寻找了不同的配置来让我的测试用例使用内存数据库而不接触我的开发实例。

flask flask-sqlalchemy sqlite3-python
1个回答
0
投票

你就快到了。而不是

def create_app():
    ...
    app.config.from_object('config.DevelopmentConfig')

def create_app(config_class):
    ...
    app.config.from_object(config_class)

然后在创建应用程序时传递

config.DevelopmentConfig
config.TestConfig

© www.soinside.com 2019 - 2024. All rights reserved.