2016-02-18 4 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

Хорошо, так что я нашел решение или, скорее, обходной путь:

Я использовал переменную окружения, чтобы указать дополнительный конфигурационный файл, который будет загружен перед тем инициализации экземпляра БД.

Так что я в конечном итоге делает это:

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 и это в моем tests.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, чтобы создать приложение.

 Смежные вопросы

  • Нет связанных вопросов^_^