这是我已经做过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 ) {
....
}]);
由于
答案 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的服务的控制器,那么您可能只想为服务中的所有这些方法创建存根(例如,使用间谍)。