70 votes

Tests unitaires de Node.js et WebSockets (Socket.io)

Quelqu'un pourrait-il fournir un test unitaire ultra-solide et extrêmement simple pour Node.js à l'aide de WebSockets (Socket.io)?

J'utilise socket.io pour Node.js et j'ai examiné socket.io-client pour établir la connexion client à un serveur lors du test. Cependant, il me semble manquer quelque chose.

Dans l'exemple ci-dessous, "travaillé ..." n'est jamais imprimé.

 var io = require('socket.io-client')
, assert = require('assert')
, expect = require('expect.js');

describe('Suite of unit tests', function() {

    describe('First (hopefully useful) test', function() {

        var socket = io.connect('http://localhost:3001');
        socket.on('connect', function(done) {
            console.log('worked...');
            done();
        });

        it('Doing some things with indexOf()', function() {
            expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
            expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
        });

    });
});
 

Au lieu de cela, je reçois simplement:

   Suite of unit tests
    First (hopefully useful) test
      ✓ Doing some things with indexOf() 


  1 test complete (26 ms)
 

Aucune suggestion?

71voto

mysterlune Points 489

Après plus de piquer et à les pousser, j'ai trouvé quelques incroyablement informations utiles à http://blog.foundry376.com/2012/09/connecting-to-a-socket-io-server-from-node-js-unit-tests. Pour l'auteur, exemple, il souligne l'étape critique de l'établissement de prise écouteurs dans le "avant*" crochets. Cet exemple fonctionne (en supposant que le serveur est à l'écoute pour les connexions socket à localhost:3001, bien sûr)

var io = require('socket.io-client')
, assert = require('assert')
, expect = require('expect.js');

describe('Suite of unit tests', function() {

    var socket;

    beforeEach(function(done) {
        // Setup
        socket = io.connect('http://localhost:3001', {
            'reconnection delay' : 0
            , 'reopen delay' : 0
            , 'force new connection' : true
        });
        socket.on('connect', function() {
            console.log('worked...');
            done();
        });
        socket.on('disconnect', function() {
            console.log('disconnected...');
        })
    });

    afterEach(function(done) {
        // Cleanup
        if(socket.connected) {
            console.log('disconnecting...');
            socket.disconnect();
        } else {
            // There will not be a connection unless you have done() in beforeEach, socket.on('connect'...)
            console.log('no connection to break...');
        }
        done();
    });

    describe('First (hopefully useful) test', function() {

        it('Doing some things with indexOf()', function(done) {
            expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
            expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
            done();
        });

        it('Doing something else with indexOf()', function(done) {
            expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
            expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
            done();
        });

    });

});

J'ai trouvé que le placement de fait() dans le beforeEach, socket.sur('connect'...) auditeur est essentiel pour avoir la connexion s'établir. Par exemple, si vous commentez done() dans l'écouteur, puis ajouter une portée (juste avant de sortir de la beforeEach), vous verrez le "pas de connexion à la pause..." message au lieu de le "débrancher..." message. Comme suit:

beforeEach(function(done) {
    // Setup
    socket = io.connect('http://localhost:3001', {
        'reconnection delay' : 0
        , 'reopen delay' : 0
        , 'force new connection' : true
    });
    socket.on('connect', function() {
        console.log('worked...');
        //done();
    });
    socket.on('disconnect', function() {
        console.log('disconnected...');
    });
    done();
});

Je suis nouveau à Moka, donc il n'y a probablement une raison évidente de l'initié pour la mise done() withiin la prise de la portée elle-même. Espérons que ce petit détail va sauver les autres dans mes chaussures de tirer les cheveux.

Pour moi, le test ci-dessus (avec la bonne portée de fait()) sorties:

  Suite of unit tests
    First (hopefully useful) test
      ◦ Doing some things with indexOf(): worked...
      ✓ Doing some things with indexOf() 
disconnecting...
disconnected...
      ◦ Doing something else with indexOf(): worked...
      ✓ Doing something else with indexOf() 
disconnecting...
disconnected...


  2 tests complete (93 ms)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X