如何使用pytest测试Flask视图上下文和模板?

时间:2019-07-12 11:28:58

标签: flask pytest

我正在将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

但是有些事情我不确定该怎么做:

  1. 如何测试视图正在使用哪个模板?

  2. 如何测试视图发送到模板的上下文? (例如,检查login_formLoginForm的实例)

  3. 如果我要测试是否存在更复杂的HTML标记,请说一个带有正确<form>属性的action标记,这是检查是否存在整个HTML标记的唯一方法标签(例如<form method="get" class="form-lg" action="/other-url">),即使我不关心其他属性?假设页面上也有其他表格,我怎么能只检查action

1 个答案:

答案 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 Cookiecuttertest_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中可能有多个元素,具体取决于视图的作用。