Angularjs 茉莉花业力测试$q未定义

Angularjs 茉莉花业力测试$q未定义,angularjs,karma-jasmine,Angularjs,Karma Jasmine,这件事我已经做了100次了,但我一辈子都搞不清楚这里发生了什么 我有一个现有的测试模块,其中所有20多个测试都工作得很好 现在,我正在尝试向该服务添加$q,以获得一种新方法。我使用的方法与之前使用的方法完全相同,但由于某些原因,$q未定义: describe( 'CacheService module', () => { let cacheService, $q, $scope; beforeEach( () => { angular.mock.module( 'a

这件事我已经做了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 ) {
    ....
}]);

谢谢

为什么在模块定义中提供$q的值?作为$q提供的$provide值是未定义的,因此在inject块中时未定义。您的代码应该如下所示:

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

具体地说,当您希望覆盖现有定义时,可以在测试中使用带有$PROFECT的函数。例如,如果您正在测试一个依赖于使用$http的服务的控制器,那么您可能只想为服务中的所有这些方法创建存根(例如spy)。

Ah!你说得对!我实际上是在我的实际代码中注入了另一个模拟服务,所以我仍然需要那个提供块,但是从中删除
$provide.value('$q',$q)
已经修复了它。谢谢。我只是把它拿出来,因为在你的例子中,你没有在里面设置任何其他东西。如果你提供模拟,肯定需要它。很高兴它现在起作用了。