2016-08-25 26 views
0

私のモジュールとユニットテストのセットアップは次のとおりです。 $ stateを設定しようとすると、$injector.get("$state")は常に楽しい不明なプロバイダをスローします。$ stateProvider < - $ stateエラーと私はなぜ理解していません。

angular.module("my-module", [ 
     //Third Party 
     "ui.bootstrap", 
     "ui.router", 
     "toaster", 
     "angular-loading-bar", 
     "ngAnimate", 
     "ngSanitize", 
     "ApplicationInsightsModule", 
     "pascalprecht.translate" 
]); 

describe("something descriptive and helpful",(): void => { 
    // a bunch of other service variables.... 
    var $state: any; 

    // I've tried with and without this line 
    beforeEach(() => angular.module("ui.router")); 

    beforeEach(() => { 

     angular.module("my-module"); 

     inject(($injector: ng.auto.IInjectorService): void => { 
      // a bunch of other service variable assignments 
      $state = $injector.get("$state"); 
     }); 
}); 
+0

また、スペックで実際のルータを使用することは厄介であることに注意する必要があります。可能であれば、$ stateProvider/$ stateに固執してください。 – estus

+0

@estusだから、もし私が私のルート構成全体を模擬しなければならないなら、それをテストするのは何ですか?私はその時点で実際にコードを書き直していますよね?それに値するとは思わない。 – Yatrix

答えて

2

あなたはモジュールをロードするために

angular.mock.module("my-module") 

を呼び出す必要があります。

+0

私はちょうどモックをやってみましたが、$状態は解決しましたが、私のui-router状態は利用できません。 '$ state.go(" home ")'は動作しません。 – Yatrix

+0

なぜそれが起こるのかを理解するのに十分なコードはありませんが、状態になるということは、単体テストで通常行うことではありません。通常、$ state.go()サービスでコントローラをテストし、コントローラがフォームを正常に送信した後、$ state.go()を呼び出して正しい状態になることを確認します状態。 –

+0

申し訳ありませんが、私は少しの文脈が助けになると思います。私がしようとしているのはユニットテストです。ですから '$ state.go(" home ")'を呼び出すと、 '$ state.current.name'をチェックするか、' url == "\ home"をチェックすることができます。これは私の質問の範囲外ですので、私はあなたの答えを受け入れました。それは私が苦労した私のためのパズルの一部です。 – Yatrix

1

$stateProvider$stateは、サードパーティのサービスをスタブし、自分のコードのみを単独でテストすることで、動く部品の数を減らすことです。

これは、基本的には、追加のスタブが必要になりますので、ui.routerモジュールがテストされたモジュールにロードすることが想定されていないこの時点で

beforeEach(module("my-module", ($provide) => { 
    $provide.factory('$state', ($q) => ({ 
    go: jasmine.createSpy().andCallFake(() => $q.resolve()); 
    })); 
})); 

it('...', inject(($state, ...) => { 
    ... 
    expect($state.go).toHaveBeenCalledWith('stateName'); 
}); 

です。

また、$stateProviderルート構成のテスト方法については、this answerも参照してください。

関連する問題