Angularjs 角度,基本测试不起作用
控制器:Angularjs 角度,基本测试不起作用,angularjs,jasmine,Angularjs,Jasmine,控制器: angular.module('ngApp', [ 'templates-app', 'templates-common', 'ngApp.home', 'ui.router' ]) .config(function myAppConfig($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/home'); }) .run(function run() {}
angular.module('ngApp', [
'templates-app',
'templates-common',
'ngApp.home',
'ui.router'
])
.config(function myAppConfig($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
})
.run(function run() {})
.controller('AppCtrl', function AppCtrl($scope) {
$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
if (angular.isDefined(toState.data.pageTitle)) {
$scope.pageTitle = toState.data.pageTitle + ' | App';
}
});
});
测试:
我现在没有测试任何东西,只是加载控制器。然而,这失败了
Chrome 41.0.2272 (Mac OS X 10.10.2) AppCtrl $scope.pageTitle should set pageTitle FAILED
TypeError: undefined is not a function
at new AppCtrl (/src/app/app.js:15:9)
at invoke (/vendor/angular/angular.js:4203:17)
at Object.instantiate (/vendor/angular/angular.js:4211:27)
at /vendor/angular/angular.js:8501:28
at /vendor/angular-mocks/angular-mocks.js:1878:12
at Object.<anonymous> (/src/app/app.spec.js:14:19)
at Object.invoke (/vendor/angular/angular.js:4203:17)
at Object.workFn (/vendor/angular-mocks/angular-mocks.js:2436:20)
Error: Declaration Location
at window.inject.angular.mock.inject (/vendor/angular-mocks/angular-mocks.js:2407:25)
at Suite.<anonymous> (/src/app/app.spec.js:12:30)
at Suite.<anonymous> (/src/app/app.spec.js:11:2)
at /src/app/app.spec.js:1:1
我认为问题在于您注入控制器的作用域和$scope。$on。试试这个:
describe('AppCtrl', function() {
beforeEach(module('ngApp'));
var $controller, $scope;
beforeEach(inject(function(_$controller_, _$rootScope_) {
$controller = _$controller_;
$rootScope = _$rootScope_.$new();
}));
describe('$scope.pageTitle', function() {
it('should set pageTitle', inject(function() {
var AppCtrl = $controller('AppCtrl', { $scope: $scope });
expect(true).toBe(true);
}));
});
});
我认为问题在于您注入控制器的作用域和$scope。$on。试试这个:
describe('AppCtrl', function() {
beforeEach(module('ngApp'));
var $controller, $scope;
beforeEach(inject(function(_$controller_, _$rootScope_) {
$controller = _$controller_;
$rootScope = _$rootScope_.$new();
}));
describe('$scope.pageTitle', function() {
it('should set pageTitle', inject(function() {
var AppCtrl = $controller('AppCtrl', { $scope: $scope });
expect(true).toBe(true);
}));
});
});
您需要从$rootScope创建作用域并将其注入:
beforeEach(inject(function (_$controller_, $rootScope) {
$controller = _$controller_;
scope = $rootScope.$new();
createController = function (ctrlName) {
return $controller(ctrlName, {
'$scope': scope
});
};
}));
通过这种方式,您可以将createController函数用于以下目的:
var AppCtrl = createController('AppCtrl');
因为有了控制器
下面是一个正在工作的JSFIDLE:
编辑:$scope在哪里是空的?
如果我在此处放置一个console.log:
我可以看到:
编辑2:
将范围设置为全局变量:
describe('AppCtrl', function () {
beforeEach(module('ngApp'));
var $controller;
var scope;
然后,在您的测试用例中,您可以使用它:
it('should set pageTitle', inject(function () {
var $scope = scope;
使用新的测试用例更新了JSFIDLE:您需要从$rootScope创建作用域并注入它:
beforeEach(inject(function (_$controller_, $rootScope) {
$controller = _$controller_;
scope = $rootScope.$new();
createController = function (ctrlName) {
return $controller(ctrlName, {
'$scope': scope
});
};
}));
通过这种方式,您可以将createController函数用于以下目的:
var AppCtrl = createController('AppCtrl');
因为有了控制器
下面是一个正在工作的JSFIDLE:
编辑:$scope在哪里是空的?
如果我在此处放置一个console.log:
我可以看到:
编辑2:
将范围设置为全局变量:
describe('AppCtrl', function () {
beforeEach(module('ngApp'));
var $controller;
var scope;
然后,在您的测试用例中,您可以使用它:
it('should set pageTitle', inject(function () {
var $scope = scope;
用新的测试用例更新了JSFIDLE:你能创建一个plnker吗?你能创建一个plnker吗?我得到一个未知的提供者:$\u rootScope\u provider似乎我有点搞砸了。我上次写控制器测试已经有一段时间了。下面代码的答案是正确的。解释问题:您正在创建的范围只是一个没有任何函数的空对象。如果你只是把东西放在上面就可以了,但是因为你在上面使用了$,所以你需要一个实际的范围。这就是$rootScope.new提供给您的I get Unknown provider:$\u rootScope\u provider似乎我有点搞砸了,我上次编写控制器测试已经有一段时间了。下面代码的答案是正确的。解释问题:您正在创建的范围只是一个没有任何函数的空对象。如果你只是把东西放在上面就可以了,但是因为你在上面使用了$,所以你需要一个实际的范围。这就是$rootScope.new给您的,我的意思是在测试文件中,$scope是空的,但scope不是空的。请参阅我的最新问题。我想实际测试触发事件时是否在作用域中设置了pageTitle。我的意思是在测试文件中,$scope是空的,但scope不是空的。请参阅我的最新问题。我想实际测试触发事件时是否在作用域中设置了pageTitle。