2013-09-21 3 views
4

io가 내 서비스를 제공합니다. 나는 yeoman과 각 작업 흐름을 사용하고 있습니다. http://yeoman.io/ 테스트가 실패하지 않도록 카르마가 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 객체를 사용해 보았지만 운이 없었습니다. 내가 카르마에서 받고 있어요 오류 :

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. 
+0

참조하고 소켓 IO를 주입? –

+2

"/socket.io/socket.io.js"파일은 일반적으로 노드 서버에 의해 동적으로 생성됩니다. karma.conf.js의 "files"배열에서 다운로드하여 로컬 버전을 저장하고 참조를 추가 할 수 있습니다. – MathieuLescure

+0

오른쪽에 표시하여 io를 무시해야합니다. 하지만 카르마 conf 파일에서이 작업을 수행해야합니까? dist 폴더로 컴파일하도록 강제로 스크립트를 가져오고 스크립트 파일을 볼 수 있습니다. 건배, –

답변

1

이 만 UI 코드를 테스트에 대해해야 서버의 일종 이러한 단위 테스트에가는 수단이기 때문에 내가, 전체 소켓 서비스를 조롱 것 (ngMock에서 $ httpBackend의 이유).

여기에 영리한 사람들이 있습니다. https://github.com/btford/angular-socket-io-seed/issues/4#issuecomment-14505212. 당신의 karma.config.js 파일 섹션에서

+0

고마워! 그것의 의미가 있습니다. Btford - 그는 자신의 물건을 알고 있습니다. 나는이 표를 줄 것이지만 세부 사항은 부족하다. –

1

은 카르마 conf.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 
], 
+0

모의고하고 모든 문제를 해결하기를 원하지 않는다면이 솔루션은 잘 작동합니다. –