2016-02-18 44 views
1

我有这样的代码:单独使用内存数据库进行测试 - 如何?

my_app.py:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

import os 

app = Flask(__name__) 
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False 
app.config["BASE_DIR"] = os.path.abspath(os.path.dirname(__file__)) 
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.abspath(os.path.join(app.config["BASE_DIR"], "app.db")) 

db = SQLAlchemy(app) 

from user import User 

# create all tables 
db.create_all() 

if not User.query.filter_by(username="test").first(): 
    dummy_user = User(username="test", password="", email="") 
    db.session.add(dummy_user) 
    db.session.commit() 

user.py:

from flask.ext.login import UserMixin 

from my_app import db 


class User(db.Model): 
    __tablename__ = "users" 

    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(255), nullable=False, unique=True) 
    email = db.Column(db.String(255), nullable=False, unique=True) 
    password = db.Column(db.String(255), nullable=False) 

tests.py:

from flask.ext.testing import TestCase 
from my_app import app, db 
from user import User 

import os 
import unittest 


class MyTestCase(TestCase): 
    def create_app(self): 
     app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:" 
     app.config["TESTING"] = True 
     return app 

    def setUp(self): 
     db.create_all() 

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

    def test_dummy(self): 
     assert User.query.count() == 0 

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

如何使单元测试工作?

我想我的单元测试使用的内存数据库从主应用程序分开,但显然我不能做我试图(通过只是改变了SQLALCHEMY_DATABASE_URI值)

感谢的方式提前!

+0

在这里有一些有用的位:http://flask.pocoo.org/docs/0.10/config/#development-production – reptilicus

+0

我不认为这对我的问题有帮助。我已经定义了一个不同于用于生产的配置。 – CryNickSystems

+0

你叫'create_app'吗? – dirn

回答

0

好了,所以我找到了解决或者说一种解决方法:

我使用的环境变量之前指定被加载额外的配置文件初始化分贝实例。

所以我最后做这样的:在我的tests.py

app.config.from_object("app.config.production") 
additional_config = os.environ.get("ADDITIONAL_CONFIG") 
if additional_config: 
    app.config.from_object(additional_config) 
我my_app.py

这:

os.environ["ADDITIONAL_CONFIG"] = "app.config.testing" 

from my_app import app, db 

(这当然是很重要的定义环境变量的之前导入应用程序对象)

无论如何感谢。

0

听起来像继承配置的完美情况!

您是否尝试过使用发现的模板here? Config基类包含所有不同环境共有的设置。但是你可以有一个使用内存数据库的开发环境。例如:

class Config: 
    # pass 

class DevConfig(Config): 
    SQLALCHEMY_DATABASE_URI = 'sqlite://path_to_in_memory_db' 

class ProductionConfig(Config): 
    SQLALCHEMY_DATABASE_URI = 'postgresql://path_to_production_db' 

这也是值得探讨使用factory pattern来创建应用程序。

相关问题