簡體   English   中英

在與測試相同的過程中測試node.js服務器

[英]Testing a node.js server in the same process as the test

我想知道在進程中啟動服務器然后在同一進程中對該服務器運行測試是否有任何不利之處。

顯然,存在一些性能問題,但是如果我們要測試准確性而不是性能,那么下面的代碼是否有任何主要問題?

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

這是在節點應用程序中測試http端點的標准方法。 但是您不會希望在每個測試中都有一個createServer()函數。 您將擁有一個創建服務器的通用功能,您可以在整個應用程序中使用它,包括啟動生產服務器。

您正確地注意到讓服務器監聽端口實際上並沒有為您做任何事情。

由於這個原因,通常有一個我所謂的應用程序工廠來啟動有關服務器的所有內容,但不監聽端口。 這樣,我可以從測試或腳本訪問服務器。 生產應用程序從最小索引文件啟動:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM