我认为我需要做的是在每次测试后使用socket.io完全重置Socket.io。
有什么想法吗?这就是我正在做的事情:
我使用Socket.IO的客户端库,角度服务(github.com/chrisenytc/ng-socket),requireJS和本地测试服务器进行测试。使用karma的监视功能时,它第一次运行正常,但后续尝试失败(事件监听器未被触发,调试日志记录显示' xhr轮询错误')。
测试的简单版本是(full version):
define(['services/serviceModule', 'angular-mocks'], function() {
describe('ILC Server Services', function() {
var socket;
beforeEach(module('ignisLibriColloqui.services', function(Config, $socketProvider) {
$socketProvider.setUrl(Config.ilcTestServerUrl);
Config.ilcServerUrl = Config.ilcTestServerUrl;
url = Config.ilcTestServerUrl;
}));
beforeEach(inject(function(ILCServerService, $socket) {
ilcServerService = ILCServerService;
socket = $socket;
}));
it('expects emit(\'ping\') to trigger on(\'pong\')', function(done) {
socket.emit('ping',{})
socket.on('pong',function(data) {
done();
});
});
});
});
,简单服务器是(full version)
var httpPort = 10999;
var socketPort = 5001;
var restify = require('restify');
var socketio = require('socket.io')(socketPort);
var fs = require('fs');
var server = restify.createServer({
name: 'ilcServer Mock'
});
var io = socketio.listen(server);
server.get(/.*/, restify.serveStatic({
'directory': __dirname,
'default': './app/index.html',
'maxAge': 0
}));
io.sockets.on('connection', function(socket) {
var socketId = socket.id;
console.log('user connected');
socket.on('ping', function(data) {
console.log('ping');
socket.emit('pong', data);
});
socket.on('disconnect',function() {
console.log('disconnect');
socket.disconnect();
});
});
server.listen(httpPort, function() {
console.log('restify server listening at %s', server.url, 'socket port:', socketPort);
});
修改
在使用logging described by the Socket.io docs仔细探索连接后,我很清楚断开客户端是不够的。客户登录" pong"未触发socket.on('pong',event)
的事件,即使使用afterEach导致socket.disconnect()
和socket.io.connect(function(){done()})
触发,也不会触发对socket.emit
的新调用。