【问题标题】:Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope Error错误:[$injector:unpr] 未知提供者:$scopeProvider <- $scope 错误
【发布时间】:2015-08-12 22:01:08
【问题描述】:

我收到这个常见错误 Error: [$injector:unpr] Unknown provider: $scopeProvider &lt;- $scope with my test case 。我知道这是一个常见的问题,并且很少有其他线程解释解决方案。但我真的想不出我的问题的答案。谁能指出我正确的方向?

ViewMeetingCtrl ,

(function () {
    'use strict';
    angular.module('MyApp').controller('ViewMeetingCtrl', ViewMeetingCtrl);

    ViewMeetingCtrl.$inject = ['$scope', '$state', '$http', '$translate', 'notificationService', 'meetingService', '$modal', 'meeting', 'attachmentService'];

    function ViewMeetingCtrl($scope, $state, $http, $translate, notificationService, meetingService, $modal, meeting, attachmentService) {
        $scope.meeting = meeting;
        $scope.test = "testvalue";
        if (meeting.Status == 'Cancelled')
        {
            $scope.actionButtons = false;
        }
        else
        {
            $scope.actionButtons = true;
        }

        //more code
    }
})();

MeetingCtrlSpec.js

describe('ViewMeetingCtrl', function () {
    var $rootScope, scope, $controller, meetingService;

    beforeEach(angular.mock.module('MyApp'));

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

    }));

    it('should change greeting value if name value is changed', function () {
        //some assertion
    });
});

错误跟踪:

Firefox 37.0.0 (Windows 8.1) ViewMeetingCtrl should change greeting value if name value is changed FAILED
        Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- ViewMeetingCtrl
        http://errors.angularjs.org/1.3.15/$injector/unpr?p0=%24scopeProvider%20%3C-%20%24scope%20%3C-%20ViewMeetingCtrl

        minErr/<@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/angular/angular.js:63:12
        createInjector/providerCache.$injector<@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/ang
ular/angular.js:4015:19
        getService@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/angular/angular.js:4162:39
        createInjector/instanceCache.$injector<@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/ang
ular/angular.js:4020:28
        getService@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/angular/angular.js:4162:39
        invoke@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/angular/angular.js:4194:1
        instantiate@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/angular/angular.js:4211:27
        $ControllerProvider/this.$get</<@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/angular/an
gular.js:8501:18
        angular.mock.$ControllerDecorator</<@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/node_modules/angular-mo
cks/angular-mocks.js:1878:12
        @C:/Users/dell pc/Documents/Work/MyApp/FLIS.Client.Tests/test/company/MeetingCtrlSpec.js:8:1
        invoke@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/bower_components/angular/angular.js:4203:14
        workFn@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/node_modules/angular-mocks/angular-mocks.js:2436:11
        angular.mock.inject@C:/Users/dell%20pc/Documents/Work/MyApp/WebApiRole/node_modules/angular-mocks/angular-mocks
.js:2407:25
        @C:/Users/dell pc/Documents/Work/MyApp/Client.Tests/test/company/MeetingCtrlSpec.js:6:16
        @C:/Users/dell pc/Documents/Work/MyApp/Client.Tests/test/company/MeetingCtrlSpec.js:1:1
Firefox 37.0.0 (Windows 8.1): Executed 3 of 3 (1 FAILED) (0.094 secs / 0.091 secs)

【问题讨论】:

  • 错字!应该是$scope: scope,你错过了一美元,不需要注入$rootScope,因为你不依赖,尽管这不是问题。
  • @PSL,非常感谢您的回复。这解决了我的问题,但最终导致另一个问题。它说Error: [$injector:unpr] Unknown provider: meetingProvider &lt;- meeting &lt;- ViewMeetingCtrl。你能给这个错误一些东西吗?因为我的解决方案中的任何地方都没有任何称为 meetingProvider 的东西。

标签: angularjs unit-testing jasmine karma-runner karma-jasmine


【解决方案1】:

替换

    $controller('ViewMeetingCtrl', {
        meetingService: meetingService,
        '$rootScope' : $rootScope,
        scope: scope
    }); 

通过

    $controller('ViewMeetingCtrl', {
        meetingService: meetingService,
        $scope: scope
    });

控制器必须注入一个名为 $scope 的参数,而不是作用域。并且 $rootScope 不是您控制器的注入协作者的一部分。

【讨论】:

  • 感谢您的回复。但是,修改后的测试用例给了我另一个错误 Error: [$injector:unpr] Unknown provider: meetingProvider &lt;- meeting &lt;- ViewMeetingCtrl 。但我没有任何称为 meetingProvider 的东西。 ?
  • 这只是意味着您还没有加载任何包含名为“会议”的服务的模块。每个服务都有一个关联的提供者(即使没有明确定义)
  • ViewMeetingCtrl.$inject = ['$scope', '$state', '$http', '$translate', 'notificationService', 'meetingService', '$modal', 'meeting', 'attachmentService']; 这些是我在 ctrl 中注入的依赖项。这是否意味着我也需要在测试用例中注入它们?
  • 没有。这意味着由于您的控制器依赖于名为“会议”的服务,因此该服务必须存在。如果存在,Angular 会注入它。
【解决方案2】:

同样的错误我忘记在scope 之前输入'$'

app.controller("loginCtrl", function(**$**scope){

})

【讨论】:

  • 您好,欢迎来到 SO。请不要添加只是重复已经存在的答案的答案。相反,请投票支持已经存在的那个。我知道目前您没有足够的代表(15),但在这种情况下,最好的方法是将此页面添加为书签,当您有足够的代表时,请回到这里并投票。否则,尽管它可能令人沮丧(我们都去过那里!),就让它过去吧。但是,请不要发布不会对已有内容添加任何内容的答案。谢谢!
猜你喜欢
  • 2016-05-09
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 2016-08-17
  • 2013-10-19
  • 2014-12-22
  • 1970-01-01
相关资源
最近更新 更多