如何使用supertest和jest测试图像上传(流)?

j_d*_*j_d 6 javascript streaming superagent supertest jest

我的API中有一个图像上传端点,它接受application/octet-stream请求并处理这些流.我想为这个端点编写测试覆盖,但无法弄清楚如何使用supertest来传输图像.

到目前为止,这是我的代码:

import request from 'supertest'

const testImage = `${__dirname}/../../../assets/test_image.jpg`

describe('Upload endpoint', () => {

  test('Successfully uploads jpg image', async () =>
    request(app)
      .post(`${ROOT_URL}${endpoints.add_image.route}`)
      .set('Authorization', `Bearer ${process.env.testUserJWT}`)
      .set('content-type', 'application/octet-stream')
      .pipe(fs.createReadStream(testImage))
      .on('finish', (something) => {
        console.log(something)
      }))

})
Run Code Online (Sandbox Code Playgroud)

这个代码什么都不产生,finish从不调用事件,没有任何控制台记录,并且这个测试套件实际上没有任何预期.我无法链接.expect到此请求,否则我得到此运行时错误:

TypeError:(0,_supertest2.default)(...).post(...).set(...).set(...).pipe(...).expect不是函数

这样的事情是如何完成的?

pop*_*ack 7

这应该有效。要将数据通过管道传输到请求,您必须告诉可读流通过管道传输到请求。另一种方式是从服务器接收数据。这也使用done而不是async因为管道不适用于 async/await。

同样值得一提的是,默认情况下管道将调用end,然后 superagent 将调用end,从而导致end被调用两次的错误。要解决这个问题,您必须告诉管道调用不要这样做,然后在流的 on end 事件中调用 end。

import request from 'supertest'

const testImage = `${__dirname}/../../../assets/test_image.jpg`

describe('Upload endpoint', () => {

  test('Successfully uploads jpg image', (done) => {
      const req = request(app)
          .post(`${ROOT_URL}${endpoints.add_image.route}`)
          .set('Authorization', `Bearer ${process.env.testUserJWT}`)
          .set('content-type', 'application/octet-stream')

      const imgStream = fs.createReadStream(testImage);
      imgStream.on('end', () => req.end(done));
      imgStream.pipe(req, {end: false})
  })
})
Run Code Online (Sandbox Code Playgroud)

编辑添加:这对我的小文件有用。如果我尝试使用大的 test_image.jpg 对其进行测试,则请求会超时。