gpt4 book ai didi

angularjs - Jasmine /AngularJS : Inject dependent service to service in unit test?

转载 作者:行者123 更新时间:2023-12-04 12:20:02 24 4
gpt4 key购买 nike

我有 Angular 模块:

var app = angular.module("SearchUI",[]);

在其中,我有一个服务“configService”,它维护着一堆配置参数:
app.provider("configService",function(){
//stuff here
})

我已经在 configService fineL 中运行了 jasmine 单元测试
describe('configService',function(){

var configService,$httpBackend;


beforeEach(module('SearchUI'));
beforeEach(inject(function(_configService_,$injector){
configService = _configService_;
$httpBackend = $injector.get("$httpBackend");

}));

it('should have default values for configService', function(){
expect(configService.getDefaultSearch()).toEqual(['abstract','title','keyword','keywordplus'
]);
});

//other stuff

所有测试都通过了。

但是,我不明白如何在另一个服务中维护该注入(inject):

即在我的应用程序中:
app.service("SearchService",function($http,$log,configService,$q){
//stuff
search_params = configService.getDefaultSearch();

})

我的规范:
describe('SearchService',function(){
var searchService,configService;

beforeEach(module('SearchUI'));
beforeEach(inject(function(_configService_,_SearchService_){
configService = _configService_;
searchService = _SearchService_;

}));


it('SearchService should return results', function(){
var waiting = searchService.SimpleSearch("card","wos",0);


//other stuff

规范失败是因为在 simplesearch 函数中需要这个:
search_params = configService.getDefaultSearch(); //get the default search parameters       

我的问题是,如何将所需的服务注入(inject)另一个服务?

最佳答案

服务只是 JavaScript 类,您可以创建它们的实例,而无需使用 Angular 的注入(inject)机制来促进您的依赖注入(inject)。相反,您可以简单地自己创建一个新的类实例,同时提供所需的参数。

目前,您正在通过内联函数创建服务:

app.service("SearchService",function($http,$log,configService,$q){...



而不是通过做一个小的调整,将服务的声明与注入(inject)到 Angular 模块中分离出来。这样做将允许您从测试访问服务类。
function SearchService($http, configService){...

app.service("SearchService", SearchService);

从您的测试套件中,您可以在 beforeEach 预处理器中准备注入(inject)剂:
describe('configService',function(){

var configService, httpBackend;
beforeEach(module('SearchUI'));
beforeEach(inject(function($httpBackend){
httpBackend = "$httpBackend";
configService = jasmine.createSpyObj('configService', ['getDefaultSearch']);
}));

/* helper method that I create to only have one place where the service is created
If I add a new param/dependency then I only have to change the construction once */
function createService(){
return new SearchService(httpBackend, configService);
}
});

采用这种方法进行测试(手动控制依赖注入(inject)而不是依赖 Angular 的实现)的主要原因是完全控制并真正隔离我要测试的项目。

关于angularjs - Jasmine /AngularJS : Inject dependent service to service in unit test?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com