我正在制作一个简单的 Flask Web 应用程序来玩,我想使用鼻子测试。我被困在如何使用 Flask-SQLAlchemy 连接到我的测试文件中的内存测试数据库。当我运行我的测试时 - Flask 连接到我的主应用程序的数据库,更重要的是,每次测试后都无法清理它。这是我的测试代码:
import nose
from nose.tools import *
from pyquery import PyQuery as pq
from flask.ext.sqlalchemy import SQLAlchemy
from app import site, db
from app.models import Post
class TestApp(object):
def setUp(self):
site.config['TESTING'] = True
site.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
self.test_app = site.test_client()
db.create_all()
def tearDown(self):
# db.session.remove()
db.drop_all()
def test_posts_index(self):
db.session.add(Post('title', 'body'))
db.session.add(Post('title2', 'body'))
db.session.commit() # this writes to production db ie app.db file
# instead of sqlite://
rv = self.test_app.get('/posts')
d = pq(rv.data)
print len(d('h1'))
assert len(d('h1')) == 2
这是我的app/__init__.py
代码:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from app import config
site = Flask(__name__)
site.config['SQLALCHEMY_DATABASE_URI'] = config.db_uri
db = SQLAlchemy(site)
site.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
from app import db_setup
db_setup.create_db()
import controllers, models
函数中的 db_setup.create_db()app/__init__.py
看起来就像这样:
from app import db
from app.models import Post
def create_db():
db.create_all()
db.session.commit()
我尝试在测试文件中实例化应用程序和数据库,但是我的模型不起作用,因为它们from app import db
,其中 db 是生产数据库对象。我还在测试用例中撒了一些打印语句,比如print db
它们打印出类似的东西<SQLAlchemy engine sqlite://>
,但它仍然会写入生产数据库。
我非常感谢有关如何解决此问题的任何提示。谢谢!