Les tests unitaires Nœud.js et WebSockets (Socket.io)

Quelqu'un pourrait-il fournir un test unitaire solide et simple pour le nœud.js utilisant WebSockets (Socket.io)?

J'utilise socket.io pour le noeud.js, et ont regardé socket. IO-client pour établir la connexion client à un serveur dans le 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)

Des suggestions?

48
demandé sur mysterlune 2013-03-19 23:57:11

3 réponses

Après avoir poussé plus loin, j'ai trouvé des informations incroyablement utiles à http://blog.foundry376.com/2012/09/connecting-to-a-socket-io-server-from-node-js-unit-tests. dans l'exemple de l'auteur, il souligne l'étape critique de l'établissement des écouteurs socket dans les crochets " before*". Cet exemple fonctionne (en supposant qu'un serveur écoute les connexions de 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 done () dans le beforeEach, socket.sur('connect'...) l'auditeur était crucial pour que la connexion soit établie. Par exemple, si vous commentez done() dans l'écouteur, puis ajoutez-le une portée (juste avant de quitter le beforeEach), vous verrez le "pas de connexion à casser..."message au lieu de la" déconnexion..." message. Comme ça:

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 sur Mocha, donc il y a probablement une raison très évidente à l'initié pour placer done () avec la portée de socket elle-même. Espérons que ce petit détail permettra d'économiser d'autres dans mes chaussures de tirer les cheveux.

Pour moi, le test ci-dessus (avec une portée correcte de done ()) 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)
49
répondu mysterlune 2014-07-17 00:04:30

Offrant une extension de la réponse acceptée ici. A la communication client-serveur de base utile comme passe-partout pour d'autres tests futurs. En utilisant Moka, chai, et attendre.

var io = require('socket.io-client')
  , io_server = require('socket.io').listen(3001);

describe('basic socket.io example', function() {

  var socket;

  beforeEach(function(done) {
    // Setup
    socket = io.connect('http://localhost:3001', {
      'reconnection delay' : 0
      , 'reopen delay' : 0
      , 'force new connection' : true
      , transports: ['websocket']
    });

    socket.on('connect', () => {
      done();
    });

    socket.on('disconnect', () => {
      // console.log('disconnected...');
    });
  });

  afterEach((done) => {
    // Cleanup
    if(socket.connected) {
      socket.disconnect();
    }
    io_server.close();
    done();
  });

  it('should communicate', (done) => {
    // once connected, emit Hello World
    io_server.emit('echo', 'Hello World');

    socket.once('echo', (message) => {
      // Check that the message matches
      expect(message).to.equal('Hello World');
      done();
    });

    io_server.on('connection', (socket) => {
      expect(socket).to.not.be.null;
    });
  });

});
5
répondu helsont 2016-05-30 04:32:52

J'ai eu ce problème: comment faire un test unitaire avec un "Socket. IO-client" si vous ne savez pas combien de temps le serveur prend pour répondre?.

J'ai résolu donc à l'aide de moka et chai:

var os = require('os');
var should = require("chai").should();
var socketio_client = require('socket.io-client');

var end_point = 'http://' + os.hostname() + ':8081';
var opts = {forceNew: true};

describe("async test with socket.io", function () {
this.timeout(10000);

it('Response should be an object', function (done) {
    setTimeout(function () {
        var socket_client = socketio_client(end_point, opts);  

        socket_client.emit('event', 'ABCDEF');

        socket_client.on('event response', function (data) {
            data.should.be.an('object');
            socket_client.disconnect();
            done();
        });

        socket_client.on('event response error', function (data) {
            console.error(data);
            socket_client.disconnect();
            done();
            });
        }, 4000);
    });
});
1
répondu juanmiguelRua 2016-02-25 09:00:40