测试Flask的send_file()发送的数据

时间:2019-08-13 11:51:28

标签: python flask openpyxl

我有一个Flask视图,该视图根据一些数据生成一个Excel文件(使用openpyxl),并使用send_file()返回给用户。 非常简化版本:

import io
from flask import send_file
from openpyxl.workbook import Workbook

@app.route("/download/<int:id>")
def file_download(id):

    wb = Workbook()
    # Add sheets and data to the workbook here.

    file = io.BytesIO()
    wb.save(file)
    file.seek(0)

    return send_file(file, attachment_filename=f"{id}.xlsx", as_attachment=True)

这正常工作-文件下载并且是有效的Excel文件。但是我不确定如何测试文件下载。到目前为止,我有这样的事情(使用pytest):

def test_file_download(test_client):
    response = test_client.get("/download/123")
    assert response.status_code == 200
    assert response.content_type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

哪个通过了,但是我想测试(a)使用的文件名是否符合预期,(b)文件...是否存在?是Excel文件吗?

我可以访问response.get_data()对象bytes,但是我不确定该如何处理。

1 个答案:

答案 0 :(得分:2)

要检查使用的文件名是否符合预期,可以检查Content-Disposition标头是否符合预期。例如:

assert response.headers['Content-Disposition'] == 'attachment; filename=123.xlsx'

要检查“文件的存在”,您可以例如检查某些测试数据是否在预期的大小范围内。例如:

assert 3000 <= response.content_length <= 5000
assert 3000 <= len(response.data) <= 5000

验证Excel文件是否有效的另一级别是尝试将数据加载回openpyxl并检查是否报告任何问题。例如:

from io import BytesIO
from openpyxl import load_workbook
load_workbook(filename=BytesIO(response.data))

在这里您可能会遇到类似如下的异常情况:

zipfile.BadZipFile: File is not a zip file

这将表明该文件的数据内容作为Excel文件无效。