我正在将Flask与pytest一起使用,并想测试我的视图和模板,但是我不清楚如何最好地做到这一点。
我知道我可以测试HTML输出的内容,例如:
def test_my_view(test_client):
# test_client is a fixture representing app.test_client()
response = test_client.get("/my-url")
assert b"<h1>My page title</h1>" in response.data
但是有些事情我不确定该怎么做:
如何测试视图正在使用哪个模板?
如何测试视图发送到模板的上下文? (例如,检查login_form
是LoginForm
的实例)
如果我要测试是否存在更复杂的HTML标记,请说一个带有正确<form>
属性的action
标记,这是检查是否存在整个HTML标记的唯一方法标签(例如<form method="get" class="form-lg" action="/other-url">
),即使我不关心其他属性?假设页面上也有其他表格,我怎么能只检查action
?
答案 0 :(得分:0)
我已经意识到1和2可以通过this question中的解决方案来解决,但可以稍作改动以用于pytest。
假设我们有这个Flask视图:
from flask import render_template
from app import app
@app.route("/my/view")
def my_view():
return render_template("my/template.html", greeting="Hello!")
我们要测试调用该URL的模板是否正确,以及是否向其传递了正确的上下文数据。
首先,创建一个可重复使用的灯具:
from flask import template_rendered
import pytest
@pytest.fixture
def captured_templates(app):
recorded = []
def record(sender, template, context, **extra):
recorded.append((template, context))
template_rendered.connect(record, app)
try:
yield recorded
finally:
template_rendered.disconnect(record, app)
我还有一个test_client
装置,可以在测试中发出请求(例如testapp
fixture in Flask Cookiecutter或test_client
fixture in this tutorial之类的东西)。
然后编写测试:
def test_my_view(test_client, captured_templates):
response = test_client.get("/my/view")
assert len(captured_templates) == 0
template, context = captured_templates[0]
assert template.name = "my/template.html"
assert "greeting" in context
assert context["greeting"] == "Hello!"
请注意,captured_templates
中可能有多个元素,具体取决于视图的作用。