Angular 单元测试未知提供者:$scopeProvider
Angular Unit Test Unknown provider: $scopeProvider
你好,我正在用 Jasmine 编写我的第一个 angular 测试,但我一直收到错误
------ 测试开始:文件:C:\Users\Regan\Documents\Visual Studio 2013\WebSites\Regan\testApp\TestProject\ng-tests\MainCtrlSpec.js ------
测试 'MainCtrl with inline mock:should have lables' 失败
错误:[$injector:unpr] 未知提供者:$scopeProvider <- $scope <- MainCtrl
我试过玩弄它但卡住了。如果您发现问题,请告诉我。如果您还需要更多代码,请告诉我,但我认为问题出在这两个文件中。
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", "Whosebug"],
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;
}
]);
由于没有 $scope
服务,$controller
提供者无法实例化注入的 $scope
参数。
您需要在使用 $controller
提供程序实例化控制器时提供作用域。您可以在 setUp 中注入 $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
}));
您还没有在任何地方定义范围以传递给控制器
describe("MainCtrl with inline mock", function () {
beforeEach(module("ChartApp"));
var ctrl, mockDataSrv;
beforeEach(module(function($provide) {
mockDataSrv = {
labels: ["Reading", "Coding", "Thinking About Coding", "Reddit", "Whosebug"],
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();
});
});
你好,我正在用 Jasmine 编写我的第一个 angular 测试,但我一直收到错误
------ 测试开始:文件:C:\Users\Regan\Documents\Visual Studio 2013\WebSites\Regan\testApp\TestProject\ng-tests\MainCtrlSpec.js ------ 测试 'MainCtrl with inline mock:should have lables' 失败 错误:[$injector:unpr] 未知提供者:$scopeProvider <- $scope <- MainCtrl
我试过玩弄它但卡住了。如果您发现问题,请告诉我。如果您还需要更多代码,请告诉我,但我认为问题出在这两个文件中。
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", "Whosebug"],
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;
}
]);
由于没有 $scope
服务,$controller
提供者无法实例化注入的 $scope
参数。
您需要在使用 $controller
提供程序实例化控制器时提供作用域。您可以在 setUp 中注入 $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
}));
您还没有在任何地方定义范围以传递给控制器
describe("MainCtrl with inline mock", function () {
beforeEach(module("ChartApp"));
var ctrl, mockDataSrv;
beforeEach(module(function($provide) {
mockDataSrv = {
labels: ["Reading", "Coding", "Thinking About Coding", "Reddit", "Whosebug"],
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();
});
});