2017-08-16 65 views
2

我正在向重构之前的遗留代码库添加集成测试。在这种情况下,上传文件。node.js无法在集成测试中上传文件

测试:

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

端点被测试生产工作正常。但要获得测试通过,我在multer模块的make-middleware.js注释掉以下行:

if (!includeFile) { 
    // appender.removePlaceholder(placeholder) 
    // return fileStream.resume() 
} 

作为缺乏经验与节点,我一定是错过了一些配置什么的。我怎样才能让我的测试通过(无需修改外部模块的代码)?

+0

你100%确信'fs.readFileSync(__目录名称+ '/logo.png')'读取文件?顺便说一句:使用'path.join(__dirname,'logo.png')'是个好主意,所以它不会在Windows上失败。 – pawel

+0

@pawel是的,绝对相信它被正确读取。好的关于窗户的提示,谢谢。 –

+0

您是否使用了发布相同文件('logo.png')的端点(此测试之外)?似乎你已经在你的服务器上为你的服务器定义了一个文件过滤器,并且该文件没有通过它... – cviejo

回答

1

multer使用busboy完成工作(获取/流文件)。你刚才评论的线条停止流:

fileStream.resume()这个代码是等价的stream.resume()busboy代码,所以它只是丢弃流:

(从busboy文档):

无论您是否关心 文件内容,您都应该始终处理stream(例如,如果您想丢弃该内容,只需执行stream.resume();,如果 )

但Multer不应该这么做!

只有当您将一个自定义fileFilter传递给Multer并将includeFile设置为false的回调时,它才会表现出这种行为。
否则,如果你没有fileFilter选项,Multer使用以下默认fileFilter(什么都不做):

function allowAll (req, file, cb) { 
    cb(null, true) 
} 

正如你所看到的,回调的第二个参数是true,这是includeFile

所以,你可以检查你的自定义fileFilter如果你有一个,如果你不这样做,这可能是一个意想不到的副作用,我祝你好运!

希望它能帮助,
最好的问候

+0

你是对的 - 它只是我不知道的fileFilter。我已经问过一个相关的问题:https://stackoverflow.com/q/46459194/404201 –