【问题标题】:How to properly test a Python Flask system based on SQLAlchemy Declarative如何正确测试基于 SQLAlchemy 声明式的 Python Flask 系统
【发布时间】:2012-10-07 04:16:26
【问题描述】:

我有一个项目我已经做了一段时间了,它是用 Flask 编写的,并使用带有声明性扩展 http://flask.pocoo.org/docs/patterns/sqlalchemy/ 的 SQLAlchemy。我最近决定开始对我的项目进行单元测试,但是对于我的生活,我似乎无法弄清楚如何使它工作。

我查看了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)

对此的任何帮助将不胜感激。如果有人以前经历过这种情况并使它起作用,我想要一些指示!提前致谢。

【问题讨论】:

  • 我也尝试过包含这个问题中的一些内容:stackoverflow.com/questions/833626/…
  • Jamie 你能详细说明一下,这个当前测试用例的目标是什么,或者你想用它实现什么。
  • @JamieStarke 对 Flask 很陌生,也遇到了同样的异常,你能帮帮我吗
  • 如果您在下面查看我的答案,我已经删除了对 declarative_base 的引用,这消除了问题。我在我的基类中设置了 declarative_base。
  • 此答案提供了有关如何执行此操作的分步说明:stackoverflow.com/a/54909106/1236990

标签: python unit-testing sqlalchemy flask flask-sqlalchemy


【解决方案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()

【讨论】:

    【解决方案2】:

    您再次实例化declarative_base,您应该使用您用作模型基类的同一个实例。此外,您似乎正在使用两个不同的session 实例,self.session 和一些模块全局session。也试着清理一下。

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 2014-05-06
      • 2014-05-06
      • 1970-01-01
      • 2012-04-17
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      相关资源
      最近更新 更多