2012-10-07 2 views
2

나는 Flask로 작성되었으며 Declarative Extension http://flask.pocoo.org/docs/patterns/sqlalchemy/과 함께 SQLAlchemy를 사용하여 얼마 동안 작업해온 프로젝트를 가지고 있습니다. 최근에 프로젝트 테스트를 시작하기로 결정했으나 내 인생에서 어떻게 작동시키는 지 알 수는 없습니다.SQLAlchemy를 기반으로 Python Flask 시스템을 올바르게 테스트하는 방법 Declarative

나는 http://flask.pocoo.org/docs/testing/을 보았지만 제대로 작동하지 않는 것 같습니다.

다른 웹 사이트에서 여러 가지를 시도했지만 올바르게 작동하는 것을 찾을 수 없습니다.

class StopsTestCase(unittest.TestCase): 

    def setUp(self): 
     self.engine = create_engine('sqlite:///:memory:') 
     self.session = scoped_session(sessionmaker(autocommit=False, 
             autoflush=False, 
             bind=self.engine)) 
     models.Base = declarative_base() 
     models.Base.query = self.session.query_property() 

     models.Base.metadata.create_all(bind=self.engine) 

    def test_empty_db(self): 
     stops = session.query(models.Stop).all() 
     assert len(stops) == 0 

    def tearDown(self): 
     session.remove() 

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

불행히도, 나는 다음과 같은 오류가 발생합니다.

OperationalError: (OperationalError) no such table: stops u'SELECT stops.agency_id AS stops_agency_id, stops.id AS stops_id, stops.name AS stops_name, stops."desc" AS stops_desc, stops.lat AS stops_lat, stops.lon AS stops_lon, stops.zone_id AS stops_zone_id \nFROM stops'() 

---------------------------------------------------------------------- 
Ran 1 test in 0.025s 

FAILED (errors=1) 

이 문제에 대한 도움을 주시면 감사하겠습니다. 누군가가 이전에 이런 일을 해보고 작동 시키면 몇 가지 조언을하겠습니다. 미리 감사드립니다.

+0

나는 또한 물건의 일부를 포함하여 시도 이 질문 에서뿐만 아니라 : http://stackoverflow.com/questions/833626/i-need-a-sample-of-python-unit-testing-sqlalchemy-model-with-nose –

+0

Jamie가 좀 더 자세히 설명해 주겠다. 이 현재의 테스트 케이스의 목적은 무엇입니까? 아니면이를 통해 무엇을 달성하고 싶습니까? –

+0

@JamieStarke는 Flask에 매우 익숙하며 동일한 예외가 발생하면 – sunny

답변

1

declarative_base을 다시 인스턴스화하는 경우 모델의 기본 클래스로 사용한 인스턴스를 사용해야합니다. 또한 두 개의 서로 다른 session 인스턴스 인 self.session과 일부 모듈 글로벌 session을 사용하는 것으로 보입니다. 청소도 해봐.

1

내가 발견하고 내가이 작업을 얻었는지, 여기에 선언 확장을 사용하여 기본 SQLAlchemy의 시스템을 테스트하기 위해 작동하는 템플릿 솔루션입니다 무엇을 기준으로합니다. **

import unittest 
from database import Base 
from sqlalchemy import create_engine 
from sqlalchemy.orm import scoped_session, sessionmaker 

import models 

class StopsTestCase(unittest.TestCase): 

    def setUp(self): 
     self.engine = create_engine('sqlite:///:memory:') 
     self.session = scoped_session(sessionmaker(autocommit=False, 
             autoflush=False, 
             bind=self.engine)) 
     Base.query = self.session.query_property() 

     Base.metadata.create_all(bind=self.engine) 

     #Create objects here 
     #These will likely involve something like the following for one of my stops 

     # stop1 = models.Stop(id=1, name="Stop 1") 
     # self.session.add(stop1) 
     # self.session.commit() 

     # But adding a stop to the database here will break the test below. Just saying. 


    def test_empty_db(self): 
     stops = self.session.query(models.Stop).all() 
     assert len(stops) == 0 

    def tearDown(self): 
     self.session.remove() 
+0

감사합니다 : D – sunny

관련 문제