lundi 25 mai 2015

Unit testing Node.js + Socket.IO : missing coverage

I'm writing an unit test for the following code, and I would like to reach the full coverage on it.

function Socket(io, nsp) {
        if(nsp===undefined || typeof nsp !=='string' || io.nsps===undefined) {
                console.log('Error: 921');
                return;
        }
        this._namespace = io.of(nsp);
        this._attachedObj=null;
        this._onConnectionEvent='';
}

Socket.prototype.sendMessage = function(event, data) {
        if(event!==undefined && data!==undefined) {
                this._namespace.emit(event, data);
        }
};

Socket.prototype.attachObject = function(obj, onConnectionEvent) {
        if(obj!==undefined && onConnectionEvent!==undefined) {
                this._attachedObj = obj;
                this._onConnectionEvent = onConnectionEvent;
                var nsp=this._namespace;
                var clientHandle = function (socket) {
                        console.log(' new client connected to ' + nsp);
                        socket.emit(onConnectionEvent, obj.getConfigJSON());
                };
                this._namespace.on('connection', clientHandle);
        }else{
                console.log('Error: 922');
        }
};

module.exports = Socket;

At this link http://ift.tt/1KgYKOv you can find covered lines. Only these 2 lines are uncovered

var clientHandle = function (socket) {
  console.log(' new client connected to ' + nsp);
  socket.emit(onConnectionEvent, obj.getConfigJSON());
};

I have no idea how to cover that block!

This is my test code:

var Socket = require('../../lib/presentationTier/socket.js');
var io = require('socket.io-client');

var assert = require('assert');

describe('Socket', function() {

    it('returns null when there are no params', function() {
        assert.strictEqual((new Socket()).hasOwnProperty('_namespace'), false);
    });

    it('returns null when there is a non-valid namespace in params', function() {
        assert.strictEqual((new Socket('wrong')).hasOwnProperty('_namespace'), false);
    });

    function RandomObj() {
        this.prop1 = 'prop1';
        this.prop2 = 'prop2';
        function getConfigJSON(){
            return 'prop1-prop2';
        }
    }

    var server = require('socket.io')();
    it('set param values to properties', function() {
        var socket1 = new Socket(server, '/namespace');
        assert.strictEqual(socket1._namespace, server.of('/namespace'));
    });

    describe('#sendMessage', function() {

        var server = require('socket.io')();
        server.listen(5000);

        var socketURL = 'http://ift.tt/1PHawbG';
        var options ={
            transports: ['websocket'],
            'force new connection': true
        };
        var client1 = io.connect(socketURL, options);

        function Mock() {}
        Mock.prototype.getConfigJSON = function() {
            return 'configJSON';
        };

        it('emits a message if given valid params', function() {
            var socket1 = new Socket(server, '/namespace');
            var object = new Mock();
            socket1.attachObject(object, 'onEvent');
            socket1.sendMessage('event', 'message');
            client1.on('connection', function(configJSON) {
                assert.strictEqual(configJSON, object.getConfigJSON());
            });
            client1.on('event', function(message) {
                assert.strictEqual(message, 'message');
            });
        });
    });
    describe('#attachObject', function() {
        it('does nothing if there are no params', function() {
            var socket1 = new Socket(server, '/namespace');
            socket1.attachObject();
            assert.strictEqual(socket1._attachedObj, null);
            assert.strictEqual(socket1._onConnectionEvent, '');
        });

        var server = require('socket.io')();
        server.listen(5000);

        var socketURL = 'http://ift.tt/1PHawbG';
        var options ={
            transports: ['websocket'],
            'force new connection': true
        };
        var client1 = io.connect(socketURL, options);

        it('attach the object in params', function() {
            var socket1 = new Socket(server, '/namespace');
            var obj2 = new RandomObj();
            socket1.attachObject(obj2, 'onEvent');
            assert.strictEqual(socket1._attachedObj, obj2);
            assert.strictEqual(socket1._onConnectionEvent, 'onEvent');
            client1.on('connection', function(message) {
                assert.strictEqual(message, 'prop1-prop2');
            });
        });
    });
});
Thank you in advance

Aucun commentaire:

Enregistrer un commentaire