2017-08-16 5 views
2

J'ajoute des tests d'intégration à un héritage de code base avant refactoring. Pour ce cas, téléchargez un fichier.Node.js ne peuvent pas télécharger le fichier dans le test d'intégration

Le test:

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

Le critère d'évaluation testé fonctionne bien dans la production. Mais pour faire passer le test, je dois commenter les lignes suivantes make-middleware.js du module multer:

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

inexpérimenté avec nœud Être, je dois avez raté une configuration ou quelque chose. Comment puis-je faire passer mon test (sans modifier le code d'un module externe)?

+0

Êtes-vous confiant à 100% que 'fs.readFileSync (__ dirname + '/logo.png')' lit le fichier? BTW: Ce serait une bonne idée d'utiliser 'path.join (__dirname, 'logo.png')' pour qu'il n'échoue pas sous Windows. – pawel

+0

@pawel Oui, absolument confiant qu'il est lu correctement. Bon conseil sur les fenêtres, merci. –

+0

Avez-vous utilisé le point de terminaison (en dehors de ce test) affichant le même fichier ('logo.png'). On dirait que vous avez défini un filtre de fichier pour multer sur votre serveur et le fichier ne passe pas, il ... – cviejo

Répondre

1

multer utilise busboy pour obtenir son travail effectué (get/fichiers de flux). Les lignes que vous avez commentés juste arrête le flux:

fileStream.resume() dans ce code est équivalent dans le code stream.resume()busboy, il rejette le flux juste:

(à partir busboy documentation):

vous devriez toujours gérer le stream peu importe si vous vous souciez du contenu du fichier ou non (par exemple, vous pouvez simplement faire stream.resume(); si vous voulez supprimer le contenu)

Mais Multer n'est pas censé se comporter de cette façon!

Il se comporte de cette façon uniquement si vous transmettez à Multer un fileFilter personnalisé avec un rappel qui définit includeFile sur false.
Sinon, si vous n'avez pas l'option fileFilter, Multer utilise la valeur par défaut suivant fileFilter (qui ne fait rien):

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

Et comme vous pouvez le voir, le deuxième paramètre de la fonction de rappel est true, qui est includeFile .

Donc, vous pouvez vérifier votre fileFilter personnalisé si vous en avez un et si vous ne l'avez pas, cela pourrait être un effet secondaire inattendu et je vous souhaite bonne chance avec!

Hope it helps,
Meilleures salutations

+0

Vous avez raison - il était juste Filefilter que je ne connaissais pas. J'ai posé une question connexe: https://stackoverflow.com/q/46459194/404201 –