承诺中的功能未在单元测试业力中调用

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.
});