Jasmine Karma Test注入$ q未定义

时间:2017-08-04 10:54:05

标签: angularjs karma-jasmine

这是我已经做过100次的事情,但是对于我的生活来说,无法解决这里发生的事情。

我已经有了这个现有的测试模块,所有20多个测试都运行得很好。

现在我尝试将$q添加到此服务以获取新方法。我使用的方法与之前使用的方法完全相同,但出于某种原因$q未定义:

describe( 'CacheService module', () => {
  let cacheService, $q, $scope;

  beforeEach( () => {
    angular.mock.module( 'app.CacheService', ( $provide ) => {
      $provide.value( '$q', $q );
    });

    inject( ( _$rootScope_, _$q_, _CacheService_ ) => {
      $scope = _$rootScope_.$new();
      $q = _$q_;

      cacheService = _CacheService_;

      console.log( _$q_ ); // undefined
    });
  });
});

被测服务声明为:

angular.module('app.CacheService', [] ).service( 'CacheService', [ '$q', function( $q ) {
    ....
}]);

由于

1 个答案:

答案 0 :(得分:1)

为什么在模块定义中为$ q提供值? $ $提供的值是未定义的,因此当您处于注入块时未定义。您的代码应如下所示:

describe( 'CacheService module', () => {
  let cacheService, $q, $scope;

  beforeEach( () => {
    //angular.mock.module( 'app.CacheService', ( $provide ) => {
    //  $provide.value( '$q', $q );
    //});
    // Do not provide a custom value for $q that is undefined
    angular.mock.module( 'app.CacheService');

    // Now $q will come from angular instead of your provided value,
    // which was undefined since you never set it.
    inject( ( _$rootScope_, _$q_, _CacheService_ ) => {
      $scope = _$rootScope_.$new();
      $q = _$q_;

      cacheService = _CacheService_;

      console.log( _$q_ ); // Should now be defined...
    });
  });
});

具体来说,如果要覆盖现有定义,可以在测试中使用带$ each的函数。例如,如果您正在测试依赖于使用$ http的服务的控制器,那么您可能只想为服务中的所有这些方法创建存根(例如,使用间谍)。