如何编写测试:Socket.io app单元测试

时间:2015-10-19 14:19:13

标签: node.js unit-testing testing express socket.io

我正在尝试使用socket.io制作简单的聊天应用。手动它工作正常(通过浏览器localhost:3000 /),但我想编写单元测试来验证服务器的逻辑。我不知道用于测试的工具/库。

这是我的节点服务器代码:

index.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var socketCount = 0;

http.listen(3000, function(){
  console.log('listening on *:3000');
});

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket) {

  socketCount++;

  console.log('new user connected');

  // Let all sockets know how many are connected
  io.emit('users connected', socketCount);

    socket.on('disconnect', function(){
    // Decrease the socket count on a disconnect, emit
    socketCount--;
    io.emit('users connected', socketCount);
    });

  socket.on('chat message', function(msg){
    // New message added, broadcast it to all sockets
    io.emit('chat message', msg);
  });

});

这是我的html页面:

file:index.html

<html>
...
<body>
    <ul id="messages"></ul>
    <div class='footer'>
      <div id="usersConnected"></div>
      <form action="">
        <input id="m" autocomplete="off" /><button>Send</button>
      </form>
    </div>
  </body>
  ...
  <script>
    $(document).ready(function(){
        $('#messages').val('');
        var socket = io();

        $('form').submit(function(){
          socket.emit('chat message', $('#m').val());
          $('#m').val('');
          return false;
        });

        // New message emitted, add it to our list of current messages
        socket.on('chat message', function(msg){
          $('#messages').append($('<li>').text(msg));
        });

        // New socket connected, display new count on page
        socket.on('users connected', function(count){
          $('#usersConnected').html('Users connected: ' + count);
        });
    });
  </script>
</html>

感谢。

1 个答案:

答案 0 :(得分:1)

我遇到了这个问题:如何使用&#34; socket.io-client&#34;进行单元测试。如果你不知道服务器需要多长时间来回复?。

我已经使用 mocha 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);
    });
});