代码之家  ›  专栏  ›  技术社区  ›  mike james

由于套接字io不存在而导致测试失败

  •  5
  • mike james  · 技术社区  · 12 年前

    io与我自己的角度服务。我正在使用yeoman和angular工作流: http://yeoman.io/ 我需要通过因果报应来识别io,这样测试就不会失败?

    'use strict';
    
    angular.module('publicApp')
        .factory('socket', function ($rootScope) {
        var socket = io.connect();
    
        return {
            on: function on(eventName, callback) {
                socket.on(eventName, function () {
                    var args = arguments;
                    $rootScope.$apply(function () {
                        callback.apply(socket, args);
                    });
                });
            },
            emit: function emit(eventName, data, callback) {
                socket.emit(eventName, data, function () {
                    var args = arguments;
                    $rootScope.$apply(function () {
                        if (callback) {
                            callback.apply(socket, args);
                        }
                    });
                });
            }
        };
    });
    
    angular.module('publicApp')
        .controller('MainCtrl', function ($scope, socket) {
        $scope.awesomeThings = [
            'HTML5 Boilerplate',
            'AngularJS',
            'Karma'];
        socket.on('person:added', function (data) {
            $scope.person = data;
        });
    });
    angular.module('publicApp', [])
        .config(function ($routeProvider) {
        $routeProvider.when('/', {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        })
            .otherwise({
            redirectTo: '/'
        });
    });
    'use strict';
    
    describe('Controller: MainCtrl', function () {
    
        // load the controller's module
        beforeEach(module('publicApp'));
    
        var MainCtrl,
        scope;
    
        // Initialize the controller and a mock scope
        beforeEach(inject(function ($controller, $rootScope) {
            scope = $rootScope.$new();
            MainCtrl = $controller('MainCtrl', {
                $scope: scope
            });
        }));
    
        it('should attach a list of awesomeThings to the scope', function () {
            expect(scope.awesomeThings.length).toBe(3);
        });
    });
    

    io是window的一部分,我尝试过使用angulars$window对象,但没有成功。我从因果报应中得到的错误是:

    Running "karma:unit" (karma) task
    WARN [karma]: Port 8080 in use
    INFO [karma]: Karma v0.10.2 server started at http://localhost:8081/
    INFO [launcher]: Starting browser Chrome
    WARN [watcher]: Pattern "/Users/michaeljames/Documents/Projects/StackOverflow/public/test/mock/**/*.js" does not match any file.
    INFO [Chrome 29.0.1547 (Mac OS X 10.8.2)]: Connected on socket LmbsWIC-97zMEi76FmiE
    Chrome 29.0.1547 (Mac OS X 10.8.2) Controller: MainCtrl should attach a list of awesomeThings to the scope FAILED
        ReferenceError: io is not defined
            at Object.$get (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/scripts/services/socket.js:5:16)
            at Object.invoke (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:3000:28)
            at /Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:2838:37
            at getService (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:2960:39)
            at invoke (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:2978:13)
            at Object.instantiate (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:3012:23)
            at /Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:4981:24
            at null.<anonymous> (/Users/michaeljames/Documents/Projects/StackOverflow/public/test/spec/controllers/main.js:14:16)
            at Object.invoke (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:3000:28)
            at workFn (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular-mocks/angular-mocks.js:1795:20)
        Error: Declaration Location
            at window.jasmine.window.inject.angular.mock.inject (/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular-mocks/angular-mocks.js:1781:25)
            at null.<anonymous> (/Users/michaeljames/Documents/Projects/StackOverflow/public/test/spec/controllers/main.js:12:14)
            at /Users/michaeljames/Documents/Projects/StackOverflow/public/test/spec/controllers/main.js:3:1
        TypeError: Cannot read property 'length' of undefined
            at null.<anonymous> (/Users/michaeljames/Documents/Projects/StackOverflow/public/test/spec/controllers/main.js:20:31)
    Chrome 29.0.1547 (Mac OS X 10.8.2): Executed 1 of 1 (1 FAILED) ERROR (0.306 secs / 0.067 secs)
    Warning: Task "karma:unit" failed. Use --force to continue.
    
    Aborted due to warnings.
    
    2 回复  |  直到 12 年前
        1
  •  2
  •   EGeuens    12 年前

    我会模拟整个套接字服务,因为这是一种访问某种服务器的方式,并且这些单元测试应该只测试UI代码(ngMock中$httpBackend的原因)。

    以下是一些聪明的家伙,他们发现了这一点: https://github.com/btford/angular-socket-io-seed/issues/4#issuecomment-14505212 .

        2
  •  1
  •   Zahidur Rahman    10 年前

    在您的 karma.config.js files部分注入服务器端socket.io.js

    files: [
      'test/unit/**/*.js',
      'any/other/included/files/*.js',
      'http://localhost:8080/socket.io/socket.io.js'   //just only inject it
    ],