0

Я пытаюсь настроить карму, чтобы выполнить некоторые модульные тесты, но я не могу заставить его работать на базовом примере:

Это файл контроллера:

angular.module('balrogApp.requests', [ 
    /* Dependancies */ 
]) 
    // Routes configuration 
    .config(['$routeProvider', function($routeProvider) { 
    /* $routeProvider configuration */ 
    }]) 
    .controller('requestsController', function(Requests, Users, Projects, RequestsComments, CostEstimations, 
              Regions, growl, $route, $rootScope, $scope, $location) { 
    this.test = 'test42'; 

/* ... */ 

}); 

Это тестовый файл:

describe('requestsController', function() { 
    beforeEach(module('balrogApp.requests')); 

    var ctrl; 
    beforeEach(inject(function($controller) { 
    ctrl = $controller('requestsController'); 
    })); 

    it('should have test = "test42"', function(){ 
    expect(ctrl.test).toBe("test42"); 
    }); 
}); 

Но эта ошибка возникает:

Chrome 43.0.2357 (Windows 7 0.0.0) requestsController should have test = "test42" FAILED Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- requestsController http://errors.angularjs.org/1.4.7/ $injector/unpr?p0=%24scopeProvider%20%3C-%20%24scope%20%3C-%20requestsController at C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:68:12 at C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:4289:19 at Object.getService [as get] (C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:4437:39) at C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:4294:45 at getService (C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:4437:39) at invoke (C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:4469:13) at Object.instantiate (C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:4486:27) at C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular/angular.js:9151:28 at C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular-mocks/angular-mocks.js:1882:12 at Object. (C:/Users/aazor102115/Desktop/Dev/Balrog/tests/requests.js:6:12) Error: Declaration Location at window.inject.angular.mock.inject (C:/Users/aazor102115/Desktop/Dev/Balrog/bower_components/angular-mocks/angular-mocks.js:2409:25) at Suite. (C:/Users/aazor102115/Desktop/Dev/Balrog/tests/requests.js:5:14) at C:/Users/aazor102115/Desktop/Dev/Balrog/tests/requests.js:1:1 TypeError: Cannot read property 'test' of undefined at Object. (C:/Users/aazor102115/Desktop/Dev/Balrog/tests/requests.js:10:16) Chrome 43.0.2357 (Windows 7 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.108 secs/0.087 secs)

ответ

2

$scope (от которого зависит ваш контроллер) является так называемым «локальным», то есть он специфичен для экземпляра контроллера и не живет в контейнере инъекции зависимостей. Вы должны предоставить его сами, например. как:

beforeEach(inject(function($rootScope, $controller) { 
    ctrl = $controller('requestsController', { $scope: $rootScope.$new() }); 
})); 

Поскольку вы создаете новую область, было бы хорошо, чтобы уничтожить его после испытания:

var scope; 

beforeEach(inject(function($rootScope, $controller) { 
    scope = $rootScope.$new(); 
    ctrl = $controller('requestsController', { $scope: scope }); 
})); 

afterEach(function() { 
    scope.$destroy(); 
}); 
Смежные вопросы