2015-11-13 2 views
1

Я пытаюсь проверить мое приложение фляги, используя unittest. Я хочу воздержаться от проверки колб, потому что я не люблю опережать меня.Как я могу проверить мое приложение фляги, используя unittest?

Я действительно боролся с этой неуместной вещью сейчас. Это запутанно, потому что есть контекст запроса и контекст приложения, и я не знаю, какой из них мне нужно, когда я вызываю db.create_all().

Похоже, что когда я добавляю в базу данных, он добавляет мои модели в базу данных, указанную в моем модуле приложения (init .py), но не базу данных, указанную в методе setUp (self).

У меня есть некоторые методы, которые должны заполнять базу данных перед каждым методом test_.

Как я могу указать свой дБ на правильный путь?

def setUp(self): 
    #self.db_gd, app.config['DATABASE'] = tempfile.mkstemp() 
    app.config['TESTING'] = True 
    # app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE'] 
    basedir = os.path.abspath(os.path.dirname(__file__)) 
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + \ 
     os.path.join(basedir, 'test.db') 
    db = SQLAlchemy(app) 
    db.create_all() 
    #self.app = app.test_client() 
    #self.app.testing = True 
    self.create_roles() 
    self.create_users() 
    self.create_buildings() 
    #with app.app_context(): 
    # db.create_all() 
    # self.create_roles() 
    # self.create_users() 
    # self.create_buildings() 

def tearDown(self): 
    #with app.app_context(): 
    #with app.request_context(): 
    db.session.remove() 
    db.drop_all() 
    #os.close(self.db_gd) 
    #os.unlink(app.config['DATABASE']) 

Вот один из методов, которые заполнят мою база данных:

def create_users(self): 
    #raise ValueError(User.query.all()) 
    new_user = User('Some User Name','[email protected]','admin') 
    new_user.role_id = 1 
    new_user.status = 1 
    new_user.password = generate_password_hash(new_user.password) 
    db.session.add(new_user) 

места Я смотрел:

http://kronosapiens.github.io/blog/2014/08/14/understanding-contexts-in-flask.html

http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xvi-debugging-testing-and-profiling

и Документация колбы : http://flask.pocoo.org/docs/0.10/testing/

ответ

0

один вопрос, что ваш наезд является ограниченностью колб контекстов, это основная причина, я думаю, долго и упорно, прежде чем включать расширение опоки в мой проект, и колба-SQLAlchemy является одним из самых больших преступников. я говорю это, потому что в большинстве случаев совершенно необязательно зависеть от контекста приложения флэсов при работе с вашей базой данных. Конечно, это может быть приятно, особенно потому, что колба-sqlalchemy делает много за кулисами для вас, в основном вам не нужно вручную управлять своей сессией, метаданными или движком, но, учитывая это, эти вещи можно легко сделать сами по себе, и для этого вы получаете неограниченный доступ к своей базе данных, не беспокоясь о контексте фляжки. Вот пример того, как настроить ваш БД вручную, первый я покажу колбу-SQLAlchemy способом, затем вручную равнину SQLAlchemy путь:

  1. flask-sqlalchemy путь:

    import flask 
    from flask_sqlalchemy import SQLAlchemy 
    
    app = flask.Flask(__name__) 
    db = SQLAlchemy(app) 
    
    # define your models using db.Model as base class 
    # and define columns using classes inside of db 
    # ie: db.Column(db.String(255),nullable=False) 
    # then create database 
    db.create_all() # <-- gives error if not currently running flask app 
    
  2. стандарт SQLAlchemy путь:

    import flask 
    import sqlalchemy as sa 
    from sqlalchemy.ext.declarative import declarative_base 
    
    # first we need our database engine for the connection 
    engine = sa.create_engine(MY_DB_URL,echo=True) 
    # the line above is part of the benefit of using flask-sqlalchemy, 
    # it passes your database uri to this function using the config value   
    # SQLALCHEMY_DATABASE_URI, but that config value is one reason we are 
    # tied to the application context 
    
    # now we need our session to create querys with 
    Session = sa.orm.scoped_session(sa.orm.sessionmaker()) 
    Session.configure(bind=engine) 
    session = Session() 
    
    # now we need a base class for our models to inherit from 
    Model = declarative_base() 
    # and we need to tie the engine to our base class 
    Model.metadata.bind = engine 
    
    # now define your models using Model as base class and 
    # anything that would have come from db, ie: db.Column 
    # will be in sa, ie: sa.Column 
    
    # then when your ready, to create your db just call 
    Model.metadata.create_all() 
    # no flask context management needed now 
    

если вы установите приложение вверх, как это, любой контекст ISSU вам нужно уйти.