model.py
from sqlalchemy.ext.declarative import declarative_base
...
Base = declarative_base()
class Team(Base):
id = Column(String, unique=True, primary_key=True)
name = Column(String, nullable=False)
engine = create_engine('sqlite://')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
test_app.py
from model import Team, Session, engine
class TestApp(TestCase):
def setUp(self):
self.connection = engine.connect()
self.trans = self.connection.begin()
self.session = Session(bind=self.connection)
def tearDown(self):
self.session.close()
self.trans.rollback()
self.connection.close()
@patch('realtime_bot.rtmbot.RtmBot.start')
def test_app_creates_one_rtmbot(self, mck):
team = Team('1', 't1')
self.session.add(team)
self.session.commit()
app = MyApp()
app.start()
self.assertEqual(len(app.bots), 1)
当我在此测试中设置调试器时,我可以看到内存中的db确实有一个Team实体。
但是一旦app.start()启动,db就已经空了。
MyApp.py
from src.model import Session, Team
class MyApp(object):
def __init__(self, directory):
super(MyApp, self).__init__()
self.bots = []
self.session = Session()
def start(self):
teams = self.session.query(Team).all()
我想这可能与会话有关?但我从模型导入两者,因此它应该是同一个实例。我有点卡在这里,会感激一些帮助。感谢
答案 0 :(得分:0)
似乎没有多少人在没有Flask-alchemy扩展的情况下使用纯SQLAlchemy。
我终于找到了解决方案。
正如我所怀疑的,关键是在单元测试和应用程序本身中使用相同的会话。
<强> MyApp.py 强>
from src.model import Session, Team, engine
class MyApp(object):
def __init__(self, directory):
super(MyApp, self).__init__()
self.bots = []
self.connection = engine.connect()
self.session = Session(bind=self.connection)
在单元测试班中:
class TestApp(TestCase):
def setUp(self):
self.connection = engine.connect()
self.trans = self.connection.begin()
self.app = MyApp()
self.session = self.app.session