让我们从控制器代码开始:
angular
.module('hc.hotelContent')
.controller('NameLocationController', nameLocationCtrlFn); //Todo change hotelDataService
nameLocationCtrlFn.$inject = ['$stateParams', 'hotelDataService'];
function nameLocationCtrlFn($stateParams, hotelDataService) {
var vm = this,
hotelId = $stateParams.hotelId;
vm.Keys = {
Name: 'Name',
Street: 'Street',
City: 'City',
State: 'State',
Zip: 'Zip',
Country: 'Country'
}
}
我确实有一些代码,但它有相关的逻辑,当我不将$ stateParmas注入控制器时,我的测试工作正常。
所以继承测试文件:
describe('nameLocation component Controller', function () {
var $controller,
hotelDataServiceMock,
stateParams,
hotelId = "4611";
Keys = {
Name: 'Name',
Street: 'Street',
City: 'City',
State: 'State',
Zip: 'Zip',
Country: 'Country'
}//@
beforeEach(module('hc.hotelContent'));
beforeEach(module('hc.app.core'));
beforeEach(inject(injectFn));
function injectFn(_$controller_, $stateParams, _hotelDataService_) {
$controller = _$controller_;
stateParams = $stateParams;
hotelDataServiceMock = _hotelDataService_;
} //controller injection fn
function initCtrl() {
controller = $controller('NameLocationController', {
$stateParams: stateParams,
hotelDataService: hotelDataServiceMock
});
}
describe('inserting a new hotel', function () {
it('should populate Keys object', function () {
var controller = initCtrl();
expect(controller.Keys).toEqual(Keys);
});
}
}
我收到了未知提供商错误。我的控制器没有任何东西,所有我在控制器中做的是将变量设置为$ stateParams变量。 我如何使用这种注射? 我的karma.conf文件被配置为以这个特定的顺序加载jquery,angular,ui-router,mocks以及之后的所有js和html
编辑:之前我确实看过this post这个帖子,但我在我的主app模块中使用了ui-router,所以我添加了beforeEach(module('hc.app'));代码但仍然没有
答案 0 :(得分:5)
在一个指令中测试$ stateParams有类似的问题:
尝试注入$state
,
然后你可以使用:
$state.go('namedurl', {your_params_here})
$rootScope.$digest()
或$适用于您的控制器
哪会更新$stateParams
。如果您尝试将$stateParams
作为模拟注入提供者,他们只会被$ state服务覆盖。
答案 1 :(得分:0)
injectFn
您的参数名称$stateParams
与您引用的变量(_$stateParams_
)不匹配的问题是什么? _$stateParams_
中未定义injectFn
。
如果这不起作用,你是否也将ui-router注入模块中,并且在测试中加载了该模块? this question中存在类似的问题。
如果您只想测试控制器使用$stateParams.hotelId
,您还可以使用以下内容模拟$stateParams
:
function injectFn(_$controller_, _hotelDataService_, $provide) {
$controller = _$controller_;
hotelDataServiceMock = _hotelDataService_;
$provide.value('$stateParams', {
hotelId: 'someId',
});
}
function initCtrl() {
return $controller('NameLocationController', {
hotelDataService: hotelDataServiceMock,
});
}