【发布时间】:2014-11-01 10:27:17
【问题描述】:
我有一个依赖于 Angular $routeParams 服务的控制器测试:
var $routeParams, MainCtrl, scope;
beforeEach(inject(function ($controller, $rootScope, $injector, $templateCache) {
scope = $rootScope.$new();
$routeParams = $injector.get('$routeParamsMock');
MainCtrl = $controller('MainCtrl', {
$scope: scope,
$routeParams: $routeParams,
});
}));
it('should load a pg from $routeParams', function(){
scope.userData = {};
$routeParams._setPg('PG_FIRST');
scope.$digest();
timeout.flush();
expect(scope.userData.pg).toBe(0);
$routeParams._setPg('PG_SECOND');
scope.$digest();
timeout.flush();
expect(scope.userData.pg).toBe(1);
});
$routeParamsMock:
!(function(window, angular){
'use strict';
angular.module('vitaApp')
.service('$routeParamsMock', function() {
var _pg = null;
return{
pg: _pg,
_setPg: function(pg){
_pg = pg;
}
}
});
})(window, window.angular);
在调试测试时,我惊讶地发现 $routeParamsMock.pg 每次都返回 null,即使我用不同的值调用 _setPg。
是因为 null 被认为是原始类型(具有对象类型...),因此按值传递?还是因为 Angular 正在复制传递给 $controller 服务的对象?
我正在寻找的解决方案最好是不需要根据不同的测试场景实例化不同的控制器的解决方案。 例如:
MainCtrl = $controller('MainCtrl', {
$scope: scope,
$routeParams: {'pg': 'PG_FIRST'},
});
MainCtrl = $controller('MainCtrl', {
$scope: scope,
$routeParams: {'pg': 'PG_SECOND'},
});
【问题讨论】:
标签: angularjs unit-testing jasmine karma-runner