2016-04-06 5 views
0

Ich frage mich, ob es einen Nachteil gibt, einen Server in einem Prozess zu starten und dann Tests für diesen Server im selben Prozess auszuführen.Testen eines node.js-Servers im selben Prozess wie der Test

Offensichtlich gibt es einige Leistungsbedenken, aber wenn wir Genauigkeit anstelle von Leistung testen, gibt es irgendwelche größeren Bedenken mit Code wie dem folgenden?

var fs = require('fs'); 
var path = require('path'); 
var http = require('http'); 
var supertest = require('supertest'); 
var assert = require('assert'); 

describe('@Test - handleXml()*', function() { 

    var self = this; 
    var server; 
    var payload = ''; // stringified XML 
    var xmlPath = path.resolve('test', 'test_data', 'xml_payloads', 'IVR_OnDemandErrorCode.xml'); 

    before(function(done) { 
     var config = self.config = require('univ-config')(module, this.test.parent.title, 'config/test-config'); 
     server = createServer().on('listening', function() { 
      done(null); 
     }); 
    }); 

    beforeEach(function(done) { 
     fs.readFile(xmlPath, 'utf8', function(err, content) { 
      assert(err == null); 
      payload = content; 
      done(); 
     }); 
    }); 

    it('should accept request Content-type "text/xml or application/xml"', function(done) { 
     supertest(server) 
      .post('/event') 
      .set('Content-Type', 'application/xml') 
      .send(payload) 
      .expect(200, done); 
    }); 


    it('should transform XML payload into JSON object', function(done) { 
     supertest(server) 
      .post('/event') 
      .set('Content-type', 'application/xml') 
      .send(payload) 
      .expect(200) 
      .end(function(err, res) { 
       assert(err == null,'Error is not null'); 
       var jsonifiedXml = JSON.parse(res.text); 
       assert(typeof jsonifiedXml === 'object','jsonifiedXml not an object'); 
       done(); 
      }); 

    }); 

    describe('JSONified XML', function() { 

     it('should have proper key casing', function(done) { 

      supertest(server) 
       .post('/event') 
       .set('Content-type', 'application/xml') 
       .send(payload) 
       .expect(200) 
       .end(function(err, res) { 
        assert(err == null); 
        var payload = JSON.parse(res.text); 
        payload = payload.events[0].data; 
        assert(payload.hasOwnProperty('ppv'),'Bad value for ppv'); 
        assert(payload.hasOwnProperty('mac'),'Bad value for mac'); 
        assert(payload.hasOwnProperty('appName'),'Bad value for appName'); 
        assert(payload.hasOwnProperty('divisionId'),'Bad value for divisionId'); 
        assert(payload.hasOwnProperty('callTime'),'Bad value for callTime'); 
        assert(payload.hasOwnProperty('callDate'),'Bad value for callDate'); 
        assert(payload.hasOwnProperty('ivrLOB'),'Bad value for ivrLOB'); 

        done(); 
       }); 
     }); 
    }); 
}); 


function createServer(opts) { 

    //Note: this is a good pattern, definitely 

    var handleXml = require(path.resolve('lib', 'handleXml')); 

    var server = http.createServer(function(req, res) { 
     handleXml(req, res, function(err) { 
      res.statusCode = err ? (err.status || 500) : 200; 
      res.end(err ? err.message : JSON.stringify(req.body)); 
     }); 
    }); 

    server.listen(5999); //TODO: which port should this be listening on? a unused port, surely 

    return server; 
} 

Antwort

1

Dies ist die Standardmethode zum Testen der HTTP-Endpunkte in einer Knotenanwendung. Aber Sie werden keine createServer() Funktion in jedem Test haben wollen. Sie haben eine gemeinsame Funktion, die einen Server erstellt, den Sie in Ihrer Anwendung verwenden können, einschließlich des Startens des Produktionsservers.

Sie merken sofort, wenn Sie bemerken, dass der Server auf einen Port hört, tut das eigentlich nichts für Sie.

Aus diesem Grund ist es üblich, eine so genannte Application Factory zu haben, die alles über einen Server startet, aber nicht auf einen Port hört. Auf diese Weise kann ich von einem Test oder einem Skript auf den Server zugreifen. Die Produktionsanwendung wird von einer minimalen Indexdatei gestartet:

var createServer = require('./AppFactory'); 
var server = createServer(); 
server.listen(5999); 
Verwandte Themen