node.js无法在集成测试中上传文件

时间:2017-08-16 15:03:50

标签: javascript node.js multer

我在重构之前将集成测试添加到遗留代码库。对于这种情况,上传文件。

测试:

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

对节点缺乏经验,我必须错过一些配置或其他东西。如何让我的测试通过(不修改外部模块的代码)?

1 个答案:

答案 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,如果你有,那么这可能是一个意想不到的副作用,我祝你好运!

希望它有所帮助,
最好的问候