gpt4 book ai didi

python - 如何测试自定义 Flask 错误页面?

转载 作者:太空狗 更新时间:2023-10-30 01:01:30 26 4
gpt4 key购买 nike

我正在尝试在 flask 中测试自定义错误页面(在本例中为 404)。

我已经这样定义了我的自定义 404 页面:

@app.errorhandler(404)
def page_not_found(e):
print "Custom 404!"
return render_template('404.html'), 404

当在浏览器中点击未知页面时,这非常有效(我在标准输出中看到 Custom 404! 并且我的自定义内容可见)。但是,当尝试使用 nose 通过 unittest 触发 404 时,会呈现标准/服务器 404 页面。我没有收到任何日志消息或我正在尝试测试的自定义内容。

我的测试用例是这样定义的:

class MyTestCase(TestCase):
def setUp(self):
self.app = create_app()
self.app_context = self.app.app_context()
self.app.config.from_object('config.TestConfiguration')
self.app.debug = False # being explicit to debug what's going on...
self.app_context.push()
self.client = self.app.test_client()

def tearDown(self):
self.app_context.pop()

def test_custom_404(self):
path = '/non_existent_endpoint'
response = self.client.get(path)
self.assertEqual(response.status_code, 404)
self.assertIn(path, response.data)

我在我的测试应用程序中将 app.debug 明确设置为 False。还有什么我必须明确设置的吗?

最佳答案

以全新的眼光重新审视此问题后,很明显问题出在我对应用程序的初始化中,而不是在我的测试/配置中。我的应用程序的 __init__.py 基本上是这样的:

def create_app():
app = Flask(__name__)
app.config.from_object('config.BaseConfiguration')
app.secret_key = app.config.get('SECRET_KEY')
app.register_blueprint(main.bp)
return app

app = create_app()

# Custom error pages

@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404

请注意,错误处理程序附加到 create_app() 之外的 @app,这是我在 TestCase.setUp()< 中调用的方法 方法。

如果我只是将该错误处理程序向上移动到 create_app() 方法中,一切正常……但感觉有点恶心?也许吧?

def create_app():
app = Flask(__name__)
app.config.from_object('config.BaseConfiguration')
app.secret_key = app.config.get('SECRET_KEY')
app.register_blueprint(main.bp)

# Custom error pages
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404

return app

这最终回答了我的问题并解决了我的问题,但我喜欢关于如何以不同方式注册这些错误处理程序的其他想法。

关于python - 如何测试自定义 Flask 错误页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25370811/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com