承诺中的功能未在单元测试业力中调用
Functions in promise not called in unit-testing karma
以下函数的以下测试总是成功,因为它从不调用任何 "then"、"catch" 或 "finally" 函数。
函数:
getItems: function() {
return $http.get(serviceRoot+'/getItems/'+idService.id()).then(function(response) {
return commonService.validateServerJson(response.data.options);
})
},
测试:
it('should get items',function(done) {
spyOn(commonService, 'validateServerJson').andCallThrough();
spyOn(idService, 'id').andCallThrough();
itemsService.getItems().then(function(response) {
expect(response.value).toEqual("fff");
expect(commonService.validateServerJson).toHaveBeenCalled();
expect(idService.id).toHaveBeenCalled();
}).catch( function(response) {
expect(false).toEqual(true);
}).finally(done);
});
您需要使用 $httpBackend 来确保您的 $http 承诺得到解决。
您可能 还需要手动调用 AngularJS 生命周期以确保您链接 $http 调用的承诺得到解决。
我建议使用 done.fail('message')
而不是 expect(false).toEqual(true)
并更好地报告所发生的情况。这也从图片中删除了 finally
,简化了测试。
这个效果更好吗?
it('should get items', function(done) {
var mockHttpResponse = { /* INSERT EXPECTED HTTP RESPONSE */};
$httpBackend.when('GET', 'INSERT/EXPECTED/PATH/HERE').respond(mockHttpResponse);
spyOn(commonService, 'validateServerJson').andCallThrough();
spyOn(idService, 'id').andCallThrough();
itemsService.getItems().then(function(response) {
expect(response.value).toEqual("fff");
expect(commonService.validateServerJson).toHaveBeenCalled();
expect(idService.id).toHaveBeenCalled();
done();
}, function(){
done.fail('getItems() promise was rejected');
});
$httpBackend.flush(); //Resolve $http promise
$rootScope.$digest(); //Force AngularJS lifecycle to run and resolve other promises.
});
以下函数的以下测试总是成功,因为它从不调用任何 "then"、"catch" 或 "finally" 函数。
函数:
getItems: function() {
return $http.get(serviceRoot+'/getItems/'+idService.id()).then(function(response) {
return commonService.validateServerJson(response.data.options);
})
},
测试:
it('should get items',function(done) {
spyOn(commonService, 'validateServerJson').andCallThrough();
spyOn(idService, 'id').andCallThrough();
itemsService.getItems().then(function(response) {
expect(response.value).toEqual("fff");
expect(commonService.validateServerJson).toHaveBeenCalled();
expect(idService.id).toHaveBeenCalled();
}).catch( function(response) {
expect(false).toEqual(true);
}).finally(done);
});
您需要使用 $httpBackend 来确保您的 $http 承诺得到解决。
您可能 还需要手动调用 AngularJS 生命周期以确保您链接 $http 调用的承诺得到解决。
我建议使用 done.fail('message')
而不是 expect(false).toEqual(true)
并更好地报告所发生的情况。这也从图片中删除了 finally
,简化了测试。
这个效果更好吗?
it('should get items', function(done) {
var mockHttpResponse = { /* INSERT EXPECTED HTTP RESPONSE */};
$httpBackend.when('GET', 'INSERT/EXPECTED/PATH/HERE').respond(mockHttpResponse);
spyOn(commonService, 'validateServerJson').andCallThrough();
spyOn(idService, 'id').andCallThrough();
itemsService.getItems().then(function(response) {
expect(response.value).toEqual("fff");
expect(commonService.validateServerJson).toHaveBeenCalled();
expect(idService.id).toHaveBeenCalled();
done();
}, function(){
done.fail('getItems() promise was rejected');
});
$httpBackend.flush(); //Resolve $http promise
$rootScope.$digest(); //Force AngularJS lifecycle to run and resolve other promises.
});