2016-03-30 1 views
1

Je reçoisSupertest + Restify fichier gzipResponse télécharger

TypeError: Cannot read property 'status' of undefined 

lors d'une tentative de télécharger un fichier à l'aide Supertest à un simple serveur restify, avec gzipResponse activé.

Versions etc:

$ npm list | grep 'super\|mocha\|restify' 
├─┬ [email protected] 
├─┬ [email protected] 
└─┬ [email protected] 
    └─┬ [email protected] 

$ node -v 
v5.5.0 

Le serveur:

const restify = require('restify'); 
const server = restify.createServer(); 

server.use(restify.gzipResponse()); 

server.put('image', (req, res) => { 
    res.send(200); 
}); 

module.exports = server; 

Le test:

const request = require('supertest'); 
const server = require('./index'); 
const path = require('path'); 

describe('insertImage', function() { 

    it('should send an image', done => { 
     request(server) 
      .put('/image') 
      .attach('image', path.join(__dirname, 'pc.png')) 
      .expect(200, done); 
    }); 

}); 

Le test PASSERA lorsque gzipResponse est désactivé, et il passera également si aucune le fichier est joint.

Je ne suis pas sûr que ce problème soit lié au super-agent/supertest, ou que le problème soit lié à restify/gzip. Toute aide est appréciée.

Répondre

1

Je pense que cela pourrait être un problème de configuration du serveur avec votre projet. Je pense que supertest et superagent gérer les réponses gzip très bien.

Voici un extrait de test moka que j'ai écrit pour le montrer. Certes, cela utilise un serveur express, mais la compression gzip est toujours activée.

var express = require('express'); 
var supertest = require('supertest'); 
var compression = require('compression'); 
var path = require('path'); 

var app = express(); 
app.use(compression()); 

app.get('/test', function(req, res) { 
    res.sendStatus(200); 
}); 

app.put('/image', function(req, res) { 
    res.sendStatus(200); 
}); 

describe('Test gzip with file upload', function(){ 
    it('Get a test page', function(done) { 
    supertest(app) 
     .get('/test') 
     .expect(200) 
     .end(function(err, res){ 
      if (err) return done(err); 
      done(); 
     }); 
    }); 

    it('Upload an image', function(done) { 
    supertest(app) 
     .put('/image') 
     .attach('image', path.join(__dirname, 'pc.png')) 
     .expect(200) 
     .end(function(err, res){ 
      if (err) return done(err); 
      done(); 
     }); 
    }); 
}); 

Bien que je ne l'ai pas utilisé beaucoup restify Je viens de créer un échantillon rapide qui utilise restify comme serveur et les tests avec Supertest passent encore. Dans votre exemple ci-dessus, avez-vous besoin d'ajouter un appel server.listen?

var supertest = require('supertest'); 
var restify = require('restify'); 
var path = require('path'); 

var server = restify.createServer(); 
server.use(restify.gzipResponse()); 

server.get('/test', function(req, res) { 
    res.send(200); 
}); 
server.put('/image', function(req, res) { 
    res.send(200); 
}); 

server.listen(3000, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 



describe('Test gzip with file upload', function(){ 
    it('Get a test page', function(done) { 
    supertest(server) 
     .get('/test') 
     .expect(200) 
     .end(function(err, res){ 
     if (err) return done(err); 
     done(); 
     }); 
    }); 

    it('Upload an image', function(done) { 
    supertest(server) 
     .put('/image') 
     .attach('image', path.join(__dirname, 'neo.jpg')) 
     .expect(200) 
     .end(function(err, res){ 
     if (err) return done(err); 
     done(); 
     }); 
    }); 
}); 
+0

Ouais c'est bizarre, je sais. Cela semble vraiment être un problème avec le combo spécifique restify + compression + supertest. Le téléchargement d'un fichier en utilisant curl fonctionne parfaitement ... – Edo

+0

@Edo Je viens de mettre à jour la réponse pour montrer un exemple en utilisant restify comme serveur API. J'utilise les mêmes deps incluant le nœud 5.5. Avez-vous besoin d'un appel server.listen? – Mikelax

+0

L'exécution de vos tests échoue pour moi car il semble que vous ayez oublié les arguments 'done' dans vos tests' it'. J'ai ajouté l'argument done et j'ai exécuté vos tests avec l'appel 'server.listen', mais le test de téléchargement échoue toujours. Très étrange. – Edo