2013-05-18 3 views
13

재스민/카르마에서 단위 테스트를 설정하는 데 어려움이 있습니다. 나는 서비스 의존성을 가진 컨트롤러를 가지고 있으며, 그 서비스는 또 다른 서비스 의존성을 가지고있다. 모듈 (지시문, 서비스 등)을 구성하는 것이 아니라 기능 (레이아웃, 요약보기 등)을 사용하여 구성합니다. 여기 자스민 및 카르마를 사용한 모듈러 앵귤러 테스트

는 아키텍처의 :

angular.module('myApp', ['ngResource', 'myApp.base', 'myApp.layout','myApp.common']); 
angular.module('myApp.base', ['myApp.common']); 
angular.module('myApp.common',[]); 
angular.module('myApp.layout',['myApp.common']); 

컨트롤러 :

angular.module('myApp.layout') 
    .controller('LayoutCtrl', ['$scope', '$rootScope', '$timeout', 'layoutService', 'urlService', 'BaseService', 
     function ($scope, $rootScope, $timeout, layoutService, urlService, BaseService) { 
      //controller code here 
    }); 

레이아웃 서비스 : 단순히 beforeEach(module('myApp.layout'));를 포함하면 내가 이해에서

angular.module('myApp.layout') 
    .service('layoutService', ['$http', '$resource', '$rootScope', '$location', '$route', 'errorHandlingService', 'utilService', 
     function ($http, $resource, $rootScope, $location, $route, errorHandlingService, utilService) { 
      //service code here 
    }); 

가, 나에 액세스 할 수 있어야합니다 내 레이아웃 모듈의 컨트롤러, 서비스, 필터 및 지시문

대신, 다음 코드는 실패 :이 오류와 함께

describe('Layout Controller', function() { 
    var ctrl, scope, service; 

    beforeEach(module('myApp')); 
    beforeEach(module('myApp.layout')); 
    beforeEach(inject(function($controller, $rootScope, layoutService) { 

     scope = $rootScope.$new(); 
     service = layoutService; 
     //Create the controller with the new scope 
     ctrl = $controller('LayoutCtrl', {$scope: scope, layoutService: service}); 
     dump(scope); 
    })); 
    it('should exist', function() { 
     expect(ctrl).toBeDefined(); 
    }); 
}); 

:

Chrome 26.0 (Mac) Layout Controller should exist FAILED 
    Error: Unknown provider: layoutServiceProvider <- layoutService 
     at Error (<anonymous>) 
     at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:28:236 
     at Object.c [as get] (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:13) 
     at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:28:317 
     at c (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:13) 
     at Object.d [as invoke] (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js:26:147) 
     at workFn (http://code.angularjs.org/1.0.4/angular-mocks.js:1754:20) 
    Error: Declaration Location 
     at window.jasmine.window.inject.angular.mock.inject (http://code.angularjs.org/1.0.4/angular-mocks.js:1740:25) 
     at null.<anonymous> (/Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:6:14) 
     at /Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:1:1 
    Expected undefined to be defined. 
    Error: Expected undefined to be defined. 
     at null.<anonymous> (/Users/scottsilvi/svn/BARO/web/src/test/js/unit/myApp.layoutModule.js:15:16) 
Chrome 26.0 (Mac): Executed 10 of 10 (1 FAILED) (0.36 secs/0.014 secs) 

생각을?

+2

모든 파일을로드하고 올바른 순서로로드하고 있습니까? – Jmr

+0

예, 문제가되었습니다. myApp 모듈의 일부 종속성이로드되지 않았습니다. 모든 것을로드하자 마자 테스트가 시작되었습니다. 계속해서 대답을하면 올바른 것으로 표시됩니다. 고마워. –

답변

10

흔히 알 수없는 공급자 오류는 파일이로드되지 않았거나 잘못된 순서로로드 된 경우에 발생합니다. 테스트가 진행되는 동안 어떤 파일이 존재하는지 확인하십시오.

+3

그냥 내 서비스에 's'가 누락되었습니다. 어 ... –

+4

@Jmr 테스트가 실행 중일 때 어떤 파일이 있는지 어떻게 감지합니까? –

+0

@GeorgeStocker logLevel DEBUG를 사용하여 카르마를 실행합니다. – Jay

0

이러한 종류의 오류는 대부분 karma.config.js 파일 내의 잘못된 파일 선언으로 인해 발생합니다. karma-jasmine의 설정은 블록의 file:[] 블록 내의 모든 파일이 karma.config.js 파일이로드 될 것으로 예상되는 순서대로 있어야합니다. 메인 모듈은 모든 커스텀 서비스의 의존성 삽입을 가지고 있고, 그 서비스를 먼저로드 한 다음 메인 모듈을로드합니다.

관련 문제