使用 SQLAlchemy 对 Flask 进行单元测试时出现问题

Trouble unittesting Flask with SQLAlchemy

一段时间以来,我一直在尝试测试我的 Flask 应用程序,但我似乎无法让它工作。

我按照文档看了一会儿,自己研究了一段时间,最后拼凑了一些东西(下面的代码),但是我的实现总是 returns 出现以下错误:

WinError 10061 Client refused connection

无论如何,这是我使用的代码,第一个是测试,第二个是我的应用程序工厂:

./tests/test_api.py

from flask_testing import TestCase
import requests
from application import create_app, db


class TestApi(TestCase):
    def create_app(self):
        return create_app("test")

    def setUp(self):
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def test_available(self):
        response = requests.get("http://localhost:5000/api")
        self.assertEquals(response.status_code, 200)

./application/__init__.py

db = SQLAlchemy()


def create_app(env_type: str = "dev"):
    app = Flask(__name__, instance_relative_config=False)

    app.config["DEBUG"] = False
    app.config["TESTING"] = True
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

    db.init_app(app)

    with app.app_context():
        from . import views # imports my views
        from . import models
        app.add_url_rule("/api/tags", view_func=views.TagEndpoint.as_view("tag_endpoint"))
        app.add_url_rule("/api/tags/<item_name>", view_func=views.TagItemEndpoint.as_view("tag_item_endpoint"))

        return app

知道我做错了什么吗?
或者也许有人为我提供了一些我可以用来构建的最小示例(文档对我帮助不大)。

编辑:在有人问之前,我确实尝试将请求 url 设置为 127.0.0.1:5000/api 和我当前的设备 ipv4 地址。

我有如下测试,它们对我有用。

from flask_testing import TestCase

class BaseTestCase(TestCase):
    def create_app(self):
        return create_app('test')


def create_app():
    #your create app code here


class sampleTestCase(BaseTestCase):
    def setUp(self):
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def test_available(self):
        response = self.client.get("http://localhost:5000/api")
        self.assertEquals(response.status_code, 200)

即使您现有的代码也应该可以工作,您只需要使用 self.client.get 而不是 requests.get