首页 > 解决方案 > 使用 Jest Supertest Formidable 测试端点时文件未以多部分形式发送

问题描述

我正在尝试测试应该接收多部分/表单数据的端点。我正在发送一组图像,我想处理并保存在服务器或 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`))

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

如果我使用 fetch 从我的反应应用程序发出相同的请求,它工作得非常好。

我究竟做错了什么?一直在这几天了,哈哈。

任何帮助都会很棒。

谢谢。

标签: node.jsexpressjestjssupertestformidable

解决方案


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

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

然后它工作。

最终解决方案

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

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

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


推荐阅读