2015-07-30 2 views
1

Я пытаюсь выполнить модульное тестирование моего веб-приложения Flask. Я использую шаблон, который я видел в классе Udemy на Flask, и шаблон, подобный Mask-учебнику Flask онлайн (http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing). Проблема, с которой я сталкиваюсь, заключается в том, что тест фактически не создает свою собственную базу данных - скорее, она использует производственную базу данных и запутывает ее.Как настроить тестовый скрипт в Flask с SQLite?

Вот что tests.py сценарий выглядит следующим образом:

import os,sys 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) 
basedir = os.path.abspath(os.path.dirname(__file__)) 

import unittest 
from myapp import app, db 
from user.models import User 

class UserTest(unittest.TestCase): 

    def setUp(self): 
     self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db') 
     app.config['TESTING'] = True 
     app.config['WTF_CSRF_ENABLED'] = False 
     app.config['SQL_ALCHEMY_DATABASE_URI'] = self.db_uri 
     self.app = app.test_client() 
     db.create_all() 

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

    def test_models(self): 
     #Create a customer user 
     user = User("John Doe", "[email protected]", "jdoe", "password", is_consultant=False) 
     db.session.add(user) 
     db.session.commit() 

     #Create 2 consultant users 
     user1 = User("Jane Doe", "[email protected]", "janedoe", "password", is_consultant=True) 
     db.session.add(user1) 
     user2 = User("Nikola Tesla", "[email protected]", "nikola", "password", is_consultant=True) 
     db.session.add(user2) 
     db.session.commit() 

     #Check that all users exist 
     assert len(User.query.all()) is 3 

Мое приложение инициализации находится в той же папке, и выглядит так:

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.migrate import Migrate 
from flask.ext.login import LoginManager 

app = Flask(__name__) 
app.config.from_object('config') 
db = SQLAlchemy(app) 

# flask-login extension setup 
login_manager = LoginManager() 
login_manager.init_app(app) 

# migration setup 
migrate = Migrate(app, db) 

from user import views 

Я не понимаю, что происходит. Он никогда не создает базу данных SQLite test.db. Он всегда создает базу данных app.db. И если он есть, это полностью испортит базу данных. Впоследствии, если я делаю python manage.py runningerver - он больше не работает. Он говорит, что таблица не найдена. Потому что разрывы упали на все столы. Что происходит? И как мне это исправить?

+0

Omigod Я понял это. Я установил неправильный ключ для URI базы данных. Это должно быть: app.config ['SQLALCHEMY_DATABASE_URI'] = self.db_uri –

ответ

2

Omigod Я понял. Я установил неправильный ключ для URI базы данных. Это должно быть: app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri.

Итак, все в порядке. Просто выполните:

class UserTest(unittest.TestCase): 

    def setUp(self): 
     self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db') 
     app.config['TESTING'] = True 
     app.config['WTF_CSRF_ENABLED'] = False 
     app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri 
     self.app = app.test_client() 
     db.create_all() 

и все работает по назначению.

Я проверил, что происходит, поставив точку прорыва в тестах и ​​посмотрев, что такое app.config, - и я увидел, что есть и ключ SQL_ALCHEMY_DATABASE_URI (который ничего не делает, и я устанавливал) и ключ SQLALCHEMY_DATABASE_URI (это важно).

+0

Самостоятельные ответы хороши для SO; Благодарю. – msw

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