【问题标题】:Saved entities within unit test, don't seem to exist within the application context单元测试中保存的实体,似乎不存在于应用程序上下文中
【发布时间】:2016-08-28 16:17:21
【问题描述】:

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)

当我在这个测试中设置调试器时,我可以看到内存中的数据库确实有一个团队实体。

但是一旦 app.start() 启动,数据库又已经是空的了。

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

我想这可能与会话有关?但我是从模型中导入的,因此它应该是同一个实例。我有点卡在这里,希望能得到一些帮助。谢谢

【问题讨论】:

    标签: python sqlalchemy python-3.5


    【解决方案1】:

    似乎没有多少人使用没有 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
    

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2012-10-21
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多