【问题标题】:Trouble unittesting Flask with SQLAlchemy使用 SQLAlchemy 对 Flask 进行单元测试时遇到问题
【发布时间】:2020-02-20 17:11:57
【问题描述】:

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

我关注了一些文档并自己研究了一段时间并最终拼凑了一些东西(下面的代码),但是我的实现总是返回以下错误:

WinError 10061 客户端拒绝连接

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

./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 地址。

【问题讨论】:

    标签: python-3.x flask flask-sqlalchemy flask-testing


    【解决方案1】:

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

    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

    【讨论】:

    • 最终解决方案如此简单让我有点尴尬,但我很高兴它现在可以工作了,非常感谢!
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2015-07-25
    相关资源
    最近更新 更多