Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 由于套接字io不存在,测试失败_Javascript_Angularjs_Socket.io_Yeoman_Karma Runner - Fatal编程技术网

Javascript 由于套接字io不存在,测试失败

Javascript 由于套接字io不存在,测试失败,javascript,angularjs,socket.io,yeoman,karma-runner,Javascript,Angularjs,Socket.io,Yeoman,Karma Runner,我用我自己的角度服务。我正在使用yeoman和angular工作流:我需要让karma识别io,以便测试不会失败 'use strict'; angular.module('publicApp') .factory('socket', function ($rootScope) { var socket = io.connect(); return { on: function on(eventName, callback) {

我用我自己的角度服务。我正在使用yeoman和angular工作流:我需要让karma识别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.
运行“业力:单位”(业力)任务
警告[karma]:端口8080正在使用
信息[karma]:karma v0.10.2服务器在启动http://localhost:8081/
信息[launcher]:启动浏览器Chrome
警告[观察者]:模式“/Users/michaeljames/Documents/Projects/StackOverflow/public/test/mock/***.js”与任何文件都不匹配。
信息[Chrome 29.0.1547(Mac OS X 10.8.2)]:连接在LmbsWIC-97zMEi76FmiE插座上
Chrome 29.0.1547(Mac OS X 10.8.2)控制器:MainCtrl应向作用域中附加一个awesomeThings列表
ReferenceError:未定义io
在Object.$get(/Users/michaeljames/Documents/Projects/StackOverflow/public/app/scripts/services/socket.js:5:16)
在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
在getService(/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:2960:39)
调用时(/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:2978:13)
在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
在空。(/Users/michaeljames/Documents/Projects/StackOverflow/public/test/spec/controllers/main.js:14:16)
在Object.invoke(/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular/angular.js:3000:28)
工作时fn(/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower_components/angular mocks/angular mocks.js:1795:20)
错误:声明位置
在window.jasmine.window.inject.angular.mock.inject(/Users/michaeljames/Documents/Projects/StackOverflow/public/app/bower\u components/angular mocks/angular mocks.js:1781:25)
在空。(/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:无法读取未定义的属性“length”
在空。(/Users/michaeljames/Documents/Projects/StackOverflow/public/test/spec/controllers/main.js:20:31)
Chrome 29.0.1547(Mac OS X 10.8.2):执行1/1(1失败)错误(0.306秒/0.067秒)
警告:任务“因果报应:单位”失败。使用--force继续。
由于警告而中止。

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

下面是一些聪明的家伙,他们发现了这一点:
.

karma.config.js
文件部分注入服务器端socket.io.js

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

您是否在karma conf.js文件中引用套接字io?文件“/socket.io/socket.io.js”通常由节点服务器动态生成。您可以下载它,存储本地版本,并在karma.conf.js的“files”数组中添加对它的引用标记您的权利,我需要忽略io。但是在karma conf文件中我在哪里做这个呢?当我强制将脚本编译到dist文件夹并可以看到脚本文件时,我得到了脚本。干杯,@MathieuLescure我已经在karma.conf和karma.e2e.conf的文件数组中添加了以下内容。。文件:['app/bower\u components/socket.io/socket.io.js']。我仍然没有定义io…谢谢!这是有道理的。他知道他的东西。我会给它打勾,但它缺乏细节。如果你不想嘲笑和经历所有这些麻烦,这个解决方案工作得很好。