如何使用SQLite在Flask中设置测试脚本?

jtw3ybtb  于 2023-04-30  发布在  SQLite
关注(0)|答案(2)|浏览(147)

我正在尝试对Flask Web应用进行单元测试。我使用的模式是我在Flask上的Udemy课程中看到的,模式类似于Flask Mega-Tutorial online(http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing)。我遇到的问题是,测试并没有实际创建自己的数据库--相反,它使用了生产数据库并把它搞得一团糟。
以下是 www.example.com 脚本看起来像:

import os,sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
basedir = os.path.abspath(os.path.dirname(__file__))

import unittest
from myapp import app, db
from user.models import User

class UserTest(unittest.TestCase):

    def setUp(self):
        self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db')
        app.config['TESTING'] = True
        app.config['WTF_CSRF_ENABLED'] = False
        app.config['SQL_ALCHEMY_DATABASE_URI'] = self.db_uri
        self.app = app.test_client()
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def test_models(self):
        #Create a customer user
        user = User("John Doe", "jdoe@jdoe.com", "jdoe", "password", is_consultant=False)
        db.session.add(user)
        db.session.commit()

        #Create 2 consultant users
        user1 = User("Jane Doe", "janedoe@gg.com", "janedoe", "password", is_consultant=True)
        db.session.add(user1)
        user2 = User("Nikola Tesla", "nikola@tesla.com", "nikola", "password", is_consultant=True)
        db.session.add(user2)
        db.session.commit()

        #Check that all users exist
        assert len(User.query.all()) is 3

我的app init在同一个文件夹中,看起来是这样的:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.migrate import Migrate
from flask.ext.login import LoginManager

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)

# flask-login extension setup
login_manager = LoginManager()
login_manager.init_app(app)

# migration setup
migrate = Migrate(app, db)

from user import views

我不明白这是怎么回事。它从来没有创建测试。db SQLite数据库。它总是创建应用程序。db生产数据库。如果它在那里,它完全搞乱了数据库在那里。之后如果我做pythonwww. example www.example.com 。上面说找不到table。因为拆了所有的table。怎么回事?我该怎么弥补?

w1jd8yoj

w1jd8yoj1#

天哪,我想通了。我为数据库URI设置了错误的键。它应该是:app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri.
所以一切都很好。只要做:

class UserTest(unittest.TestCase):

    def setUp(self):
        self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db')
        app.config['TESTING'] = True
        app.config['WTF_CSRF_ENABLED'] = False
        app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri
        self.app = app.test_client()
        db.create_all()

一切都按计划进行
我通过在测试中设置断点来检查发生了什么,看看是什么应用程序。config是--我看到有一个SQL_ALCHEMY_DATABASE_URI键(它不做任何事情,我正在设置)和一个SQLALCHEMY_DATABASE_URI键(这是一个重要的键)。

new9mtju

new9mtju2#

我和你遇到了同样的问题,但原因不同。我的错误是在DevelopmentConfig和TestingConfig中使用了相同的数据库名称!它应该是不同名称,例如data-dev。sqlite和data-test。 sqlite
config.py

class DevelopmentConfig(Config):
   DEBUG = True
   SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 
       'data-dev.sqlite')

class TestingConfig(Config):
   TESTING = True 
   SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 
       'data-test.sqlite')

相关问题