2016-02-18 46 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來創建應用程序。

相關問題