Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用pytest测试Flask视图上下文和模板?_Flask_Pytest - Fatal编程技术网

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

如何使用pytest测试Flask视图上下文和模板?,flask,pytest,Flask,Pytest,我将pytest与Flask一起使用,希望测试我的视图和模板,但我不清楚如何最好地做到这一点 我知道我可以测试HTML输出的内容,例如: def test_my_视图(测试客户端): #test_client是一个表示app.test_client()的夹具 response=test\u client.get(“/myurl”) 在response.data中断言b“我的页面标题” 但有些事情我不确定该怎么做: 如何测试视图正在使用的模板 如何测试视图发送到模板的上下文?(例如,检查登录表单

我将pytest与Flask一起使用,希望测试我的视图和模板,但我不清楚如何最好地做到这一点

我知道我可以测试HTML输出的内容,例如:

def test_my_视图(测试客户端):
#test_client是一个表示app.test_client()的夹具
response=test\u client.get(“/myurl”)
在response.data中断言b“我的页面标题”
但有些事情我不确定该怎么做:

  • 如何测试视图正在使用的模板

  • 如何测试视图发送到模板的上下文?(例如,检查
    登录表单
    是否是
    登录表单
    的实例)

  • 如果我想测试是否存在一个更复杂的HTML标记,比如一个具有正确的
    action
    属性的
    标记,这是检查整个标记(例如
    )是否存在的唯一方法,即使我不担心其他属性?假设页面上也有其他表单,我怎么能检查
    操作


  • 我已经意识到1和2可以通过类似于中的解决方案来解决,稍微修改一下,以便与pytest一起使用

    假设我们有一个烧瓶视图:

    从flask导入渲染模板
    从应用程序导入应用程序
    @应用程序路径(“/my/view”)
    定义我的视图():
    返回渲染模板(“my/template.html”,greeting=“Hello!”)
    
    我们想测试调用该URL是否使用了正确的模板,并且传递了正确的上下文数据

    首先,创建一个可重复使用的夹具:

    来自flask导入模板\u
    导入pytest
    @pytest.fixture
    def捕获的_模板(应用程序):
    记录=[]
    def记录(发件人、模板、上下文,**额外):
    记录。追加((模板,上下文))
    模板\u呈现。连接(记录、应用)
    尝试:
    产量记录
    最后:
    已呈现模板。断开连接(记录、应用)
    
    我还有一个
    test\u客户端
    fixture,用于在测试中发出请求(类似于或)

    然后写下你的测试:

    def test_my_视图(测试客户端、捕获的模板):
    response=test\u client.get(“/my/view”)
    断言len(捕获的_模板)==1
    模板,上下文=捕获的\u模板[0]
    assert template.name=“my/template.html”
    在上下文中断言“问候语”
    断言上下文[“问候语”]=“你好!”
    

    请注意,根据视图的功能,您可能在捕获的模板中有多个元素。

    这太棒了!正是我需要的!干得好,先生!