我无法理解为什么我的HomeCtrl中的vm.chartData永远不会填充我在beforeEach()中嘲笑过的数据。 console.log(scope.vm.chartData)返回undefined,即使正确定义和更改了其他范围变量如graphLoading也是如此。
describe('HomeCtrl', function () {
var controller, scope, myService, q, $timeout;
beforeEach(module('dashboardApp'));
beforeEach(inject(function ($controller, $rootScope, $q, _$timeout_) {
controller = $controller;
scope = $rootScope.$new();
$timeout = _$timeout_;
myService = jasmine.createSpyObj('Chart', ['get']);
q = $q;
}));
describe('when returning promises', function () {
beforeEach(function () {
myService.get.and.returnValue(q.when( { result:
'Stuff'
}));
controller('HomeCtrl as vm', { $scope: scope, Chart: myService });
scope.$apply();
});
it('test dirty graph init', function () {
expect(scope.vm.graphLoading).toBe(true);
scope.vm.dirtyTestGraph();
scope.$digest();
$timeout.flush();
expect(scope.vm.graphLoading).toBe(false);
console.log(scope.vm.chartData);
});
});
});
来自homectrl的相关代码
vm.dirtyTestGraph = function() {
vm.graphTitle = 'Deposit Amount';
$timeout(function(){
Chart.get( { interval:'3h', type:'_type:deposit',
from:1416960000000, to:Date.now() } )
.then(function(chart){
vm.graphLoading = false;
vm.chartData = chart.data;
});
}, 2000);
};
,这是Chart工厂中Chart.get的返回值
return $q.all([chartData])
.then(function(data){
var graphData = data[0].data.facets[0].entries;
var newData = [];
graphData.forEach(function(element){
var newElem = {
time: element.time,
deposits: element.total.toFixed(2)
};
newData.push(newElem);
});
return new Chart(newData);
});
答案 0 :(得分:1)
您的控制器代码正在data
返回的承诺中的对象中查找Chart.get
属性:
vm.chartData = chart.data;
但是你的测试存根正在返回一个没有data
属性的对象:
myService.get.and.returnValue(q.when({
result: 'Stuff'
}));
所以vm.chartData
被赋予未定义的分配。