如何正确测试基于SQLAlchemy声明的Python Flask系统

如何正确测试基于SQLAlchemy声明的Python Flask系统,python,unit-testing,sqlalchemy,flask,flask-sqlalchemy,Python,Unit Testing,Sqlalchemy,Flask,Flask Sqlalchemy,我有一个项目,我已经工作了一段时间,它是在Flask中编写的,使用SQLAlchemy和声明性扩展。我最近决定开始对我的项目进行单元测试,但就我的一生而言,我似乎不知道如何让它工作 我看了看,但我似乎无法让它工作 我尝试了不同网站的东西,但找不到正确的东西 class StopsTestCase(unittest.TestCase): def setUp(self): self.engine = create_engine('sqlite:///:memory:')

我有一个项目,我已经工作了一段时间,它是在Flask中编写的,使用SQLAlchemy和声明性扩展。我最近决定开始对我的项目进行单元测试,但就我的一生而言,我似乎不知道如何让它工作

我看了看,但我似乎无法让它工作

我尝试了不同网站的东西,但找不到正确的东西

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)

在此方面的任何帮助都将不胜感激。如果有人曾经经历过这件事,并使它的工作,我想一些指针!提前感谢。

您再次实例化了
声明性\u base
,您应该使用与用作模型基类的实例相同的实例。此外,您似乎正在使用两个不同的
session
实例,
self.session
和一些模块global
session
。也可以尝试清理它。

根据我的发现和工作方式,这里有一个模板解决方案,用于使用声明性扩展测试底层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()

我还试着把这个问题中的一些内容也包括进来:Jamie,你能再详细说明一下吗,这个当前测试用例的目标是什么,或者你想用它实现什么。@JamieStarke对Flask很陌生,也有同样的例外,你能帮我看看下面的答案吗,我已经删除了对声明性_base的引用,这就解决了这个问题。我在我的基类中设置了声明性的_基。这个答案给出了如何执行的分步说明: