2017-08-04 3 views
0

これは私が100回行ったことですが、私の人生は何が起こっているのかは分かりません。

20個以上のすべてのテストが完全に機能しているこの既存のテストモジュールがあります。

今、新しいメソッドのために$qをこのサービスに追加しようとしています。おかげで

答えて

1

なぜあなたは

angular.module('app.CacheService', []).service('CacheService', [ '$q', function($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 
    }); 
    }); 
}); 

サービス:私が以前に使用してきましたが、何らかの理由$qのために定義されていないとまったく同じ方法を使用していますあなたのモジュール定義に$ 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... 
    }); 
    }); 
}); 

具体的には、既存の定義を上書きする場合は、テストで$ provideの関数を使用します。たとえば、$ httpを使用するサービスに依存するコントローラをテストする場合、サービス内のすべてのメソッドのスタブを作成するだけです(スパイなど)。

+0

Ah!あなたが正しい!私は実際に私の実際のコードで別の模倣されたサービスを注入しているので、私はまだそのブロックを提供する必要がありますが、それから '$ provide.value( '$ q'、$ q)'を取り除いて固定しました。ありがとう。 – James

+0

あなたの例では、そこに他のものを設定していなかったので、私はそれを取り出しました。モックを提供しているのであれば間違いなく必要です。うれしい今それは働いている。 – Patrick