我在重构之前将集成测试添加到遗留代码库。对于这种情况,上传文件。
测试:
it('uploads a photo at the specified index', done => {
chai.request(server.instance)
.post('/profile/photo/0')
.set('Access-Token', `${token}`)
.set('API-Key', testConfig.apiKey)
.field({contentId: 'foobar'})
.attach('file', fs.readFileSync(__dirname + '/logo.png'), 'file')
.end((err, res) => {
console.log(JSON.stringify(res.body))
res.should.have.status(200)
done()
})
})
正在测试的端点在生产中正常工作。但为了让测试通过,我必须在make-middleware.js
模块的multer
中注释掉以下几行:
if (!includeFile) {
// appender.removePlaceholder(placeholder)
// return fileStream.resume()
}
对节点缺乏经验,我必须错过一些配置或其他东西。如何让我的测试通过(不修改外部模块的代码)?
答案 0 :(得分:1)
multer
使用busboy
完成工作(获取/流文件)。您评论的行只会停止流:
fileStream.resume()
相当于stream.resume()
代码中的busboy
,因此它只会丢弃该流:
(来自busboy
文档):
如果你关心的话,你应该总是处理
stream
文件内容与否(例如,您只需stream.resume();
即可 你想丢弃内容)
但是Multer不应该这样做!
如果您使用将fileFilter
设置为false的回调传递给Multer自定义includeFile
,它的行为方式就是这样。
否则,如果您没有fileFilter
选项,Multer会使用以下默认fileFilter
(无效):
function allowAll (req, file, cb) {
cb(null, true)
}
正如您所看到的,回调的第二个参数是true
,即includeFile
。
所以,你可以查看你的自定义fileFilter
,如果你有,那么这可能是一个意想不到的副作用,我祝你好运!
希望它有所帮助,
最好的问候