使用 Jest Supertest Formidable 测试端点时,文件未以多部分形式发送

Files not being sent in a multipart form when testing endpoint using Jest Supertest Formidable

我正在尝试测试应该接收 multipart/form-data 的端点。我正在发送一组图像,我想处理这些图像并将其保存在服务器或 CDN 上。我正在使用 Jest、Express 和 Formidable。

端点

router.post("/videos", async (req, res) => {

  new formidable.IncomingForm().parse(req, (err, fields, files) => {
    console.log('PARSE FORM');
    if (err) {
      console.error('Error', err);
      throw err
    }
    console.log('Fields', fields);
    console.log('Files', files);
    for (const file of Object.entries(files)) {
      console.log('FILE', file)
    }
  });

  res.status(200).send('Created Video');
});

测试

describe("Video Endpoints", () => {
  it('should create a new timelapse video', done => {
    request
      .post('/api/videos')
      .field('file', 'some random value')
      .attach('image', `${__dirname}/__mocks__/image.png`)
      .then(res => {
        console.log('THEN');
        done();
      })
  });
});

当运行测试时,它没有达到强大的解析方法。

如果将我的附加方法更改为此...

.attach('image', fs.readFileSync(`${__dirname}/__mocks__/xdebugcurlaccessingwpapi.png`))

它将到达解析方法,但它将它视为字段而不是文件。

如果我发出相同的请求,但使用 fetch 从我的 React 应用程序发出,则它工作得很好。

我做错了什么?已经搞了几天了哈哈。

任何帮助都会很棒。

谢谢。

我不完全确定为什么,但如果你添加

.set({connection: 'keep-alive'})

然后就可以了。

最终解决方案

request
  .post('/api/videos')
  .set({connection: 'keep-alive'})
  .field('name', 'Richard')
  .attach('image', mockImage)
  .then(res => {
    console.log('THEN');
    done();
  });
});

如果有人能理解为什么会这样就好了。

我认为它可能会关闭图像流但不能确定。