单元测试中保存的实体似乎不存在于应用程序上下文中

时间:2016-05-03 14:38:43

标签: python sqlalchemy python-3.5

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()

我想这可能与会话有关?但我从模型导入两者,因此它应该是同一个实例。我有点卡在这里,会感激一些帮助。感谢

1 个答案:

答案 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