2017-08-04 61 views
0

这是我做了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

你为什么在模块定义中为$ q提供一个值?您$作为$ 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... 
    }); 
    }); 
}); 

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

+0

啊!你是对的!实际上我在我的实际代码中注入了另一个模拟服务,所以我仍然需要提供block,但是从它中删除'$ provide.value('$ q',$ q)'已经修复了它。谢谢。 – James

+0

我只是把它拿出来,因为在你的例子中你没有设置任何其他东西。绝对需要它,如果你提供嘲笑。很高兴现在正在工作。 – Patrick