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不是函数
这样的事情是如何完成的?
这应该有效。要将数据通过管道传输到请求,您必须告诉可读流通过管道传输到请求。另一种方式是从服务器接收数据。这也使用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 对其进行测试,则请求会超时。