我的控制器代码如下:
$q.all([qService.getData($scope.id), dService.getData(), qTService.get()])
.then(function (allData) {
$scope.data1 = allData[0];
$scope.data2 = allData[1];
$scope.data3 = allData[2];
});
在我的单元测试中,我正在做这样的事情:
beforeEach(inject(function($rootScope, $q, $location){// and other dependencies...
qServiceSpy = spyOn(_qService, 'getData').andCallFake(function () {
var data1 = {
id: 1,
sellingProperty: 1,
};
var d = $q.defer();
d.resolve(data1);
return d.promise;
});
dServiceSpy = spyOn(_dService, 'getData').andCallFake(function () {
var data2 = [{ "id": "1", "anotherProp": 123 }];
var d = $q.defer();
d.resolve(data2);
return d.promise;
});
qTServiceSpy = spyOn(_qTService, 'get').andCallFake(function () {
var data3 = [{ id: 0, name: 'Rahul' }];
var d = $q.defer();
d.resolve(data3);
return d.promise;
});
rootScope = $rootScope;
});
现在在我的测试中,我正在检查服务是否被调用并且data1、data2不是未定义的。
it('check if qService' got called, function() {
expect(scope.data1).toBeUndefined();
rootScope.$digest();
expect(_quoteService.getQuote).toHaveBeenCalled();
});
it('check if "data1" is defined', function () {
expect(scope.data1).toBeUndefined();
rootScope.$digest();
expect(scope.data1).toBeDefined();
});
我的问题是,在控制器中使用了 q.all 和在测试中将 scope.$apply
替换为 rootScope.$digest
后,之前正常运行的代码出现了问题。使用 q.all 和 rootScope.$digest
(也尝试过使用 scope.$apply
),两个测试都会失败并显示以下错误信息:如果我删除10 $digest() iterations reached. Aborting!
rootScope.$digest
,那么 promises 就永远不会被解决,测试就会失败并显示以下错误信息:有什么帮助可以让我如何使用expected undefined to be defined.
q.all
进行单元测试代码?我看到了这篇文章:this post,但那也没有帮助,因为我已经尝试使用 $digest
。
$apply
通常会接收一个回调函数。我更喜欢使用scope.$digest()
,它只会对当前的作用域进行脏检查,因此性能更好。 - Frank van Wijk