gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:24:36 31 4
gpt4 key购买 nike

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

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

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)
}))

})

此代码没有产生任何结果,finish 事件从未被调用,控制台没有记录任何内容,并且此测试套件实际上通过了任何预期的结果。我不能将 .expect 链接到这个请求上,否则我会得到这个运行时错误:

TypeError: (0 , _supertest2.default)(...).post(...).set(...).set(...).pipe(...).expect is not a function

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

最佳答案

这应该有效。要将数据通过管道传输到请求,您必须告诉可读流通过管道传输到请求。另一种方式是从服务器接收数据。这也使用 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})
})
})

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

关于javascript - 如何使用 supertest 和 jest 测试图像上传(流)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49510314/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com