2016-03-30 4 views
1

IchSupertest + Restify gzipResponse Datei-Upload

bekommen
TypeError: Cannot read property 'status' of undefined 

, wenn eine Datei mit Supertest auf einen einfachen restify Server hochzuladen versuchen, mit gzipResponse eingeschaltet.

Versionen etc:

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

$ node -v 
v5.5.0 

Der Server:

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

server.use(restify.gzipResponse()); 

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

module.exports = server; 

Der 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); 
    }); 

}); 

Der Test wird passieren, wenn gzipResponse deaktiviert ist, und es wird auch passieren, wenn kein Datei ist angehängt.

Ich bin mir nicht sicher, ob dieses Problem superagent/superestest ist, oder ob das Problem mit restify/gzip liegt. Jede Hilfe wird geschätzt.

Antwort

1

Ich denke, das könnte ein Serverkonfigurationsproblem mit Ihrem Projekt sein. Ich denke supertest und superagent Handle Gzip Antworten ganz gut.

Hier ist ein Mokka-Test-Snippet, das ich geschrieben habe, das es funktioniert zeigt. Zugegeben, dies ist ein Express-Server, aber es ist immer noch Gzip-Komprimierung aktiviert.

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

Obwohl ich nicht restify viel benutzt habe ich gerade eine schnelle Probe, der als Server verwendet restify und die Tests mit Supertest noch passieren. In Ihrem obigen Beispiel müssen Sie einen Server.listen Aufruf hinzufügen?

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

Ja, es ist seltsam, ich weiß. Es scheint wirklich ein Problem mit der spezifischen Restify + Kompression + Supertest Combo zu sein. Das Hochladen einer Datei mit curl funktioniert einwandfrei ... – Edo

+0

@Edo Ich habe gerade die Antwort aktualisiert, um ein Beispiel mit restify als API-Server anzuzeigen. Ich benutze die gleichen Deps einschließlich Knoten 5.5. Benötigen Sie einen server.listen Anruf? – Mikelax

+0

Das Ausführen Ihrer Tests schlägt für mich fehl, weil es so aussieht, als hätten Sie die 'done' Argumente in Ihren' it' Tests vergessen. Ich habe das Argument "done" hinzugefügt und die Tests mit dem Aufruf "server.listen" ausgeführt. Der Upload-Test ist jedoch weiterhin fehlgeschlagen. Sehr eigenartig. – Edo