如何阅读超测其余部分的附件?

How to read an attachement from res of supertest?

我有一个明确的终点“/api/posts/:id”,returns 一些关于 post 的元数据和 post 文件本身通过 res.attachment(post.fileName).send(post). (注意我不确定这是否正确)

我正在尝试使用 supertest 对其进行测试。后 const res = await request(server).get("/api/posts/a"); 我可以通过 res.body 读取 post 元数据。但是如何阅读附件(即文件)呢?

编辑:

看来我需要使用formidable之类的库来读取返回的文件。 res.files 默认情况下为空,但强大的填充它。所以我试着在我的笑话测试文件中这样做,如下所示:

const res = await request(server).get(`/api/posts/${post._id}`);
const form = formidable();
form.parse(res, (err, fields, files) => {
  console.log("inside parse");
  expect(0).toBe(1);
});

但这没有用。控制台没有记录 "inside parse" 事实上,即使 expect(0).toBe(1) 应该使它失败,案例也通过了。

在回答之前,我只想指出我发送 post 的方式不正确。所以我最终通过 res.sendFile(post.fileName)

自行发送文件

继续阅读测试时的文件。如上所述,我不得不使用 formidable 来填充 res.files 参数。此外,我不得不修改我的 jest 测试函数,让它等待 formidable 的回调完成:

it("returns 200 with post file when given existing post id", async (done) => {
  ...

  const res = await request(server).get(`/api/posts/${post._id}`);
  const form = formidable();
  form.parse(res, (err, fields, files) => {
    try {
      expect(0).toBe(1);
      done();
    } catch (error) {
      done(error);
    }
  });
});

编辑:

我发现一个更好的方法是使用超级测试期望通过:

const expectedFile = await fsPromises.readFile(filename);
request(server)
  .get(`/api/posts/${post._id}/file`)
  .expect(200, expectedFile, done);