侦听同一个Socket.IO套接字发出的事件

时间:2014-10-15 21:32:46

标签: angularjs testing socket.io

我正在测试一个包装Socket.IO的Angular服务。为此,我需要监听我正在创建的同一个套接字发出的事件。

这是服务:

angular.module('core').factory('SocketIOService', ['$rootScope',
    function($rootScope) {

        var socket = io();

        return {

            on: function(eventName, callback) {
                var args = arguments;
                socket.on(eventName, function() {
                    $rootScope.$apply(function() {
                        callback.apply(socket, args);
                    });
                });
            }

        };
    }
]);

一段测试文件(SocketIOService是我正在创建的服务,socket是来自io()的全局单例返回值,$rootScope是注入的$rootScope):

it('should apply changes using $rootScope.$apply', function() {
    var rootScopeSpy = sinon.spy($rootScope, '$apply');
    SocketIOService.on('anEvent', function() {});
    socket.emit('anEvent', {});
    expect(rootScopeSpy.calledOnce).toBe(true);
});

但是,socket没有“听到”它正在侦听的事件本身也会发出声音。有没有办法发出一个事件,还能听(并'听')那个事件?

1 个答案:

答案 0 :(得分:0)

在html中:你必须包含< script src =“http://yourdomain/socket.io/socket.io.js”>在标题中。

在Angular中:

$scope.socket = new function () {
                    var self = this;
                    var socketIO;
                    var socketConfig = {};
                    self.connect = function () {
                        if (socketIO) {
                            socketIO.connect(socketConfig);
                            return;
                        }
                        socketIO = io(window.location.protocol + '//' + window.location.hostname + ":7777", socketConfig);
                        socketIO.on('connect', function () {
                            $scope.$apply();
                        });
                        socketIO.on('your_event', function (data) {
                           // dosomething
                            $scope.$apply();
                        });

                    };
                    self.get_data = function () {
                         socketIO.emit('get_data', your data);
                    };

                }
                $scope.socket.connect();