我有一个带局部变量的控制器
function IndexCtrl($scope) {
var pagesById = [];
loadPages();
// snip
function loadPages() {
// pagesById gets populated
}
// snip
}
我想测试pagesById是否正确填充但我不知道如何从我的it()获取它。我不需要将此变量放在$ scope中,它只是一组中间信息,所以如果我可以避免将它添加到$ scope中那么理想。
it('scope.pages should populated based on pages data.', function() {
$httpBackend.flush();
expect(pagesById).toEqualData(mock_page_results);
});
给了我
ReferenceError: pagesById is not defined
除了将其附加到$ scope之外,我还有其他选择吗?
答案 0 :(得分:16)
在茉莉花规格中,首先创建控制器:
var ctrl;
beforeEach(inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('myController', {
$scope: scope
});
}));
然后,您可以通过ctrl.pagesById
访问其属性。当然,您需要在控制器中使用var pagesById
,而不是this.pagesById
。
答案 1 :(得分:1)
这是我在Angular方法中测试局部变量的方法:
//------- Function for getting value of local variables
function getLocalVariable(sLocalVarName, obj, method, args){
method = method.toString();
let changedMethod = method.substring(0, method.lastIndexOf("}")) + ";" + "return " + sLocalVarName + "}";
eval(' changedMethod = ' + changedMethod);
return changedMethod.call(obj, args)
}
//----------- service
class assignStuffService {
getAvaliableStuff(shift) {
const params = {
agency_id: 0 ,
start_time: shift.data.shift.start_time,
end_time : shift.data.shift.end_time
};
}
}
//----------- part of spec
it('should set values to "params" object props', () => {
let shift = {
data:{
shift:{
start_time:'',
end_time:''
}
}
};
let params = getLocalVariable('params',
assignStuffService,
assignStuffService.getAvaliableStuff,
shift);
expect(params).toEqual({
agency_id: 0 ,
start_time: shift.data.shift.start_time,
end_time : shift.data.shift.end_time
});
});