2016-03-24 22 views
1

私はAngularを使い慣れていません。依存性注入の仕組みが正確ではありません。私の問題は、サービスBに依存するサービスAを持っていることですが、サービスAをテストBに注入すると、サービス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 
      }])); 
    }); 

})。

私がServiceMethodを呼び出すと、エラーが発生することがあります。"TypeError:プロパティ 'プロパティ'が未定義です"。変わったことは、$リソースは決して定義されていませんが、私の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); 
関連する問題