Đấ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ĩ?
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
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. –