2017-08-16 17 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 –