2016-03-24 112 views
1

我是Angular的新手,我不太确定依赖注入是如何工作的。我的问题是我有服务A取决于服务B,但是当我将服务A注入到我的测试时服务B变得未定义。我看过Injecting dependent services when unit testing AngularJS services但这个问题有点不同于我的。单元测试中未定义注入的依赖关系

这个Injected Dependencies become undefined in angular service与我的问题非常相似,但我无法翻译JS。

我还更改了我的变量名称并简化了代码以删除不相关的行。

Service.ts

export class ServiceA { 
    constructor(private $resource: ng.resource.IResourceService, private ServiceBInstance: ServiceB){ 
    } 

    ServiceAMethod() { 
     var resources = ServiceBInstance.property; //ServiceBInstance is undefined here 
    } 
} 

factory.$inject = [ 
    '$resource' 
    'ServiceBModule' 
]; 
function factory($resource: ng.resource.IResourceService, ServiceBInstance: ServiceB): IServiceA { 
    return new ServiceA($resource, ServiceBInstance); 
} 

angular 
    .module('ServiceAModule') 
    .factory('ServiceA', 
    factory); 

Spec.ts

describe('ServiceB',(): void => { 

    beforeEach((): void => { 
     angular.mock.module(
      'ServiceAModule', 
      'ServiceBmodule', 
      'ngResource' 
     ); 
    }); 

    describe('ServiceAMethod',(): void => { 

     it("should...", inject(
      ['ServiceA', (ServiceAInstance: ServiceA): void => { 
       ServiceAInstance.ServiceAMethod(); //Problem Here 
      }])); 
    }); 

});

我遇到的问题是,当我打电话给ServiceAMethod时,我得到一个错误,指出“TypeError:无法读取未定义的”“属性'属性'。奇怪的是$ resource永远不会被定义,但是我的ServiceB总是未定义的。

我认为,当我将ServiceA注入到我的测试中时,它应该会自动注入它的所有依赖关系。

另外请注意,我不是故意嘲笑ServiceB。

更新

我也试着注入我ServiceB的实例为但是当我打印出来的变量也指出,是不确定的,当我尝试做下面的代码到beforeEach

inject(function (_ServiceBInstance_: ServiceB) { 
     console.log(_ServiceBInstance_); 
    }); 

我得到和未知提供商错误。

回答

0

好吧,经过几个小时的搜索,我终于找到了答案。我忘了,包括其中包括角的.config方法

在创建供应商确保你也呼吁的.config文件,这里有一个例子:

angular 
    .module('ServiceBModule') 
    .config(['ServiceBProvider', (ServiceBClass) => { //Very Important 
     //Code here 
    }]) 
    .provider('ServiceB', ServiceB);