2017-07-13 11 views
2

私はui-router 1.0.5に移行しようとしていますが、ほとんどの作業を行っていますが、$stateChangeXXXイベントリスナーを置き換える新しい移行フックをテストする方法の例はありません。

コードの前に:

scope.$on('$stateChangeSuccess', this.hideSpinner_.bind(this));

後:

this.transitions_は私がしてテストすることができました前に、UI-ルータ this.transitions_.onSuccess({}, this.hideSpinner_.bind(this));

によって公開さ$transitionsサービスですscope.$broadcast($stateChangeSuccess)を使用してからscope.$apply()。 UI-ルータの新しいバージョンで動作するようにテストを書き換える方法

expect(ctrl.loading).toBe(true); 
expect(ctrl.showLoadingSpinner).toBe(true); 

// when 
scope.$broadcast('$stateChangeSuccess'); 
scope.$apply(); 

// then 
expect(ctrl.loading).toBe(false); 
expect(ctrl.showLoadingSpinner).toBe(false); 

任意のアイデア:これはUI-ルータ0.xので働いていましたか?

+0

はあなたをしましたこれらのフックをテストする方法を見つける – mindparse

答えて

0

私は同じ質問があります。そして、私はONSTARTフックの「stateChangeStart」イベントをブロードキャストしている愚かなソリューションを選択しました:

$transitions.onStart({}, function($transition$){ 
    $scope.$broadcast('$myStateChangeStart', $transition$.to(), $transition$.params('to'), $transition$.from(), $transition$.params('from'), $transition$.options(), $transition$) 
}) 

その後、私はいくつかの「同時性」のロジックを処理し、レガシーコードのあまりを変更する必要はありません。

希望します。あなたが良い練習を持っているなら、plsは教えてくれます。

+0

これは私が念頭に置いたことではありませんが、一時的な回避策はテストをパスするために働くはずです。実際のコードに追加するのではなく、パフォーマンスに影響を与える可能性があるため、テストで直接登録します。ありがとう! – floreks

1

まあ、

私は前に正確にUI-ルータ0.3.xから1.0.5

のApp

への移行と同じ問題に直面した:

scope.$on('$stateChangeSuccess', someFunction); 

後:

私はちょうど(コールバックが何をテストしたいので、私は嘲笑の移行と直接コールバック関数を呼び出す

scope.$broadcast('$stateChangeSuccess'); 
scope.$apply(); 

後:

$transitions.onSuccess({}, someFunction); 

前にテストここにはtrans。$ to()。トランス。$から()が必要です。)に名前を付ける:

var mockTransition = { 
    $to: function() { return {name: 'foo'}; }, 
    $from: function() { return {name: 'bar'}; } 
}; 
service.someFunction(mockTransition); 
$scope.$digest(); 

そして、私のテストでいくつかの場所で、私は私が本当のいずれかの操作を行いますので、全体の移行プロセスをシミュレートしたい、イベントが適切に呼ばれている方法:

it('should handle transitions error properly when trying to make transition to an abstract state', function (done) { 
    spyOn(console, 'error'); 
    spyOn(transitions, 'onError'); 

    transitions.onError({}, function(transition) {}); 

    $stateTest.transitionTo("c3.app.offre").then(function() { 

    }, function() { 
     expect(console.error).toHaveBeenCalled(); 
     expect(transitions.onError).toHaveBeenCalled(); 
     done(); 
    }); 
    scope.$apply(); 
}); 
+0

残念ながら、この解決法は私の問題を本当に解決しません。つまり、transitions.onSuccessを使用して登録されたコールバック関数を実行できる必要があります。成功した状態変更に関する私のケースでは、コンポーネントのいくつかの変数が設定されています。 – floreks

関連する問題