【问题标题】:Angular Unit Test Unknown provider: $scopeProviderAngular 单元测试未知提供者:$scopeProvider
【发布时间】:2015-03-04 19:12:01
【问题描述】:

你好,我正在用 Jasmine 编写我的第一个角度测试,但我一直收到错误

------ 测试开始:文件:C:\Users\Regan\Documents\Visual Studio 2013\WebSites\Regan\testApp\TestProject\ng-tests\MainCtrlSpec.js ------ 使用内联模拟测试“MainCtrl:应该有​​标签”失败 错误:[$injector:unpr] 未知提供者:$scopeProvider

我尝试过使用它,但被卡住了。如果您发现问题,请告诉我。如果您还需要更多代码,请告诉我,但我认为问题出在这两个文件中。

MainCtrlSvc.js

/// <reference path="../../Scripts/angular/angular.js" />
/// <reference path="../../Scripts/angular/angular-mocks.js" />
/// <reference path="../../Scripts/chartjs/Chart.js" />
/// <reference path="../../Scripts/angular-chart.js-master/dist/angular-chart.js" />
/// <reference path="../../Scripts/controller/main-controller.js" />
/// <reference path="../../Scripts/service/data-service.js" />
/// <reference path="../../libs/jasmine/jasmine.js" />

describe("MainCtrl with inline mock", function () {
    beforeEach(module("ChartApp"));

    var ctrl, mockDataSrv;

    beforeEach(module(function($provide) {
        mockDataSrv = {
            labels: ["Reading", "Coding", "Thinking About Coding", "Reddit", "StackOverflow"],
            data: [500, 300, 300, 40, 220],
            type: "PolarArea",
            title: "Angular Chart Expriment"
        };
        $provide.value("DataSrv", mockDataSrv);
    }));

    beforeEach(inject(function ($controller) {
        ctrl = $controller("MainCtrl");
    }));

    it("should have lables", function () {
        expect(scope.labels).toBeDefined();
    });
});

MainCtrl.js

var app = angular.module("ChartApp", ["chart.js"]);

    app.controller("MainCtrl", ["$scope",
      function ($scope, DataSrv) {
          $scope.labels = DataSrv.labels;
          $scope.data = DataSrv.data;
          $scope.type = DataSrv.type;
          $scope.title = DataSrv.title;
      }
    ]);

【问题讨论】:

    标签: angularjs unit-testing


    【解决方案1】:

    由于没有$scope 服务,$controller 提供者无法实例化注入的$scope 参数。

    您需要在使用$controller 提供程序实例化控制器时提供范围。你可以在你的设置中注入$rootScope,你可以通过$rootScope.$new()来获得一个子作用域。将其作为参数注入$controller 构造函数。即$controller("MainCtrl", {$scope:scope }),其中范围是新的子范围,即使您可以传入 $rootScope。

       var ctrl, mockDataSrv, scope;
        //... Your code
        //...
        beforeEach(inject(function ($controller, $rootScope) {
            scope = $rootScope.$new(); //get a childscope
            ctrl = $controller("MainCtrl", {$scope:scope }); //Pass it as argument as $scope's value
        }));
    

    【讨论】:

      【解决方案2】:

      您尚未在任何地方定义范围以传递给控制器​​

      describe("MainCtrl with inline mock", function () {
          beforeEach(module("ChartApp"));
      
          var ctrl, mockDataSrv;
      
          beforeEach(module(function($provide) {
              mockDataSrv = {
                  labels: ["Reading", "Coding", "Thinking About Coding", "Reddit", "StackOverflow"],
                  data: [500, 300, 300, 40, 220],
                  type: "PolarArea",
                  title: "Angular Chart Expriment"
              };
              $provide.value("DataSrv", mockDataSrv);
          }));
      
          var scope; //<--- define scope
          beforeEach(inject(function ($controller, $rootScope) {
              scope = $rootScope.$new(); //<--- initialize scope
              ctrl = $controller("MainCtrl", {$scope: scope}); //<--- inject scope
      
          }));
      
          it("should have lables", function () {
              expect(scope.labels).toBeDefined();
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2014-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        相关资源
        最近更新 更多