15

我正在使用supertest测试我的 API 端点,效果很好,但我不知道如何测试文件下载是否成功。

在我的路由文件中,我将端点定义为:

app.get('/api/attachment/:id/file', attachment.getFile);

函数getFile()看起来像这样:

exports.getFile = function(req, res, next) {
    Attachment.getById(req.params.id, function(err, att) {
        [...]
        if (att) {
            console.log('File found!');
            return res.download(att.getPath(), att.name);
        }

然后,在我的测试文件中,我尝试以下操作:

describe('when trying to download file', function() {
    it('should respond with "200 OK"', function(done) {
        request(url)
        .get('/api/attachment/' + attachment._id + '/file');
        .expect(200)
        .end(function(err, res) {
            if (err) {
                return done(err);
            }
            return done();
        });
    });
});

我确定该文件已找到,因为它注销了File found!. 如果我手动尝试它也可以正常工作,但由于某种原因,摩卡返回Error: expected 200 "OK", got 404 "Not Found"

我已经尝试过不同的 mime-types 和 supertest .set("Accept-Encoding": "*"),但没有任何效果。

有人知道怎么做吗?

4

2 回答 2

3

要么问题已在库中修复,要么代码的其他部分存在错误。您的示例运行良好,并给出

  when trying to download file
File found!
    ✓ should respond with "200 OK"
于 2016-02-14T23:09:08.980 回答
0

在测试下载文件时,仅验证来自服务器的响应状态是不够的,如果您能以某种方式验证响应数据,那就更好了。

对于下载数据,文件内容通常在http响应中传递为text,文件类型为Content-Type,附件和文件名存储在Content-Disposition.

根据您想了解的详细程度,您可以尝试以下操作:

    const response = await request(url)
            .get('/api/attachment/' + attachment._id + '/file');
    expect(response.headers["content-type"]).toEqual("image/png");
    expect(response.text).toMatchSnapshot(); // Use only if the file is deterministic.

使用 jest 或任何其他快照框架,您可以实现更可靠的测试。

这可能来晚了,但我将其放在这里以供将来参考并帮助可能面临类似情况的其他人。

于 2022-01-25T06:20:15.070 回答