2013-05-18 26 views
13

Đấu tranh để thử nghiệm đơn vị được thiết lập trong Jasmine/Karma. Tôi có một bộ điều khiển với một sự phụ thuộc dịch vụ, và dịch vụ đó có một sự phụ thuộc dịch vụ khác. Tôi không tổ chức các mô-đun của tôi theo loại (Chỉ thị, Dịch vụ, vv), mà là theo tính năng (layout, summaryView, vv).Kiểm tra mô-đun AngularJS w/Jasmine & Karma

Dưới đây là kiến ​​trúc:

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']); 

Bộ điều khiển:

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

Dịch vụ 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 
    }); 

Từ những gì tôi hiểu, nếu tôi chỉ đơn giản bao gồm beforeEach(module('myApp.layout'));, tôi cần phải có quyền truy cập vào bộ điều khiển, dịch vụ, bộ lọc và chỉ thị của tôi trong mô-đun bố cục của tôi.

Thay vào đó, đoạn mã sau thất bại:

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(); 
    }); 
}); 

Với lỗi này:

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) 

Suy nghĩ?

+2

Bạn có chắc chắn rằng tất cả các tệp đang được tải và đang được tải theo đúng thứ tự không? – Jmr

+0

vâng, hóa ra đó là vấn đề. Một số phụ thuộc trong mô-đun myApp không được tải. Ngay sau khi tôi tải tất cả, các bài kiểm tra bắt đầu hoạt động. Hãy tiếp tục và gửi câu trả lời và tôi sẽ đánh dấu là chính xác. Cám ơn. –

Trả lời

10

Thường thì lỗi Nhà cung cấp không xác định đến từ các tệp không được tải hoặc được tải theo thứ tự không chính xác. Kiểm tra xem tệp nào hiện diện trong khi các thử nghiệm của bạn đang chạy.

+3

Chỉ cần thêm vào này tôi đã mất một 's' trong dịch vụ của tôi. ughh ... –

+4

@Jmr làm cách nào để bạn phát hiện tệp nào có mặt khi thử nghiệm đang chạy? –

+0

@GeorgeStocker Chạy nghiệp với logLevel DEBUG – Jay

0

Các lỗi như vậy chủ yếu xảy ra do khai báo không chính xác các tệp trong tệp karma.config.js. Để thiết lập karma-jasmine tất cả các tệp trong khối file:[] của karma.config.js tệp phải theo thứ tự mà chúng được dự kiến ​​sẽ được tải. Mô-đun chính là có tiêm phụ thuộc của bất kỳ dịch vụ tùy chỉnh nào sau đó tải dịch vụ đó trước và sau đó là mô-đun chính.

Các vấn đề liên quan