使用 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
一段时间以来,我一直在尝试测试我的 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