Angular JS:在Jasmine中无法用promises测试服务函数

Angular JS : Not able to test service function with promises in Jasmine

本文关键字:promises 测试 服务 函数 JS Jasmine Angular      更新时间:2023-09-26

这里,_fact是对服务的引用。

 it('Git Check', function() {
     $scope.user = 'swayams'
     var data;
      _fact.Git($scope).then(function(d) {
        expect(d.data.length).toEqual(4)
     }, function() {  expect(d).not.toBeNull(); });
    });

我得到错误

SPEC HAS NO EXPECTATIONS Git Check

根据@FelisCatus强制异步并添加$formDigest后,我得到了不同的错误Error: Unexpected request: GET https://api.github.com/users/swayams/repos No more request expected

更新后的代码片段看起来像-
 it('Git Check', function(done) {
         $scope.user = 'swayams'
         var data;
          _fact.Git($scope).then(function(d) {
            expect(d.data.length).toEqual(4)
         }, function() {  expect(d).not.toBeNull(); });
        });
 $rootScope.$formDigest();

我这里有一个Plunk来说明这个问题。

Jasmine没有看到您的期望,因为您的函数在调用任何expect()之前返回。根据你的情况,你可能想使用异步测试,或者使用一些承诺匹配器。

使用异步测试,您可以向测试函数done添加一个额外的参数。

it('Git Check', function (done) {
  $scope.user = 'swayams'
  var data;
   _fact.Git($scope).then(function(d) {
     expect(d.data.length).toEqual(4);
  }, function() {  expect(d).not.toBeNull(); }).finally(done);
  $rootScope.$digest();
});

(注意promise链末尾的finally子句)

请注意,你必须做$rootScope.$digest()承诺解决,即使你的代码不使用它。参见:在没有$作用域强制摘要的情况下,如何解决AngularJS, Jasmine 2.0中的承诺?