2013-09-27 8 views
11

angularjsの指令の$ destroyイベントのユニットテストの仕方は?破壊スコープでのテスト方法

は、私は私の指示でコードを持っている:

scope.$on('$destroy', function() { 
    //clean something 
}); 

私のテストコード:

it('on destroy',function(){ 
    scope.$destroy(); 
    scope.$digest(); 

    //expect everything done? 
}); 

どれ提案!

答えて

10

ディレクティブのテンプレートからDOMを選択し、その範囲を取得してから$ destroy()を実行できます。

例:

あなたのTPL:

"<div id='tuna'></div>" 

テスト:

it('test on destroy', function(){ 
    var isolateScope = $(element).find('#tuna').eq(0).scope(); 
    isolateScope.$destroy(); 
}) 

希望をお手伝い!

+0

私はそれを手に入れました!感謝。 –

+0

あなたは大歓迎です! –

10

$destroyイベント内で実行されるコードをテストする必要があります。

テスト

app.controller('MainCtrl', function($scope) { 
    $scope.$on('$destroy', function() { 
    $scope.destroyed = true; 
    }); 
}); 

Plunker here

it('sets destroyed to true when the scope is destroyed', function() { 
    // Arrange 
    $scope.destroyed = false; 

    // Act 
    $scope.$destroy(); 

    // Assert 
    expect($scope.destroyed).toBe(true); 
}); 

コントローラ:ここでコントローラを使用して不自然な例です。

+1

こんにちは!私はあなたのコントローラの範囲のソリューションだと思う。私はディレクティブでスコープのテストを破棄したい。感謝! –

+0

私はディレクティブと同じ解決策だと思います。あなたのコードでPlunkerスクリプトを作成できますか? –

+0

これは実用的です。状態をチェックするための組み込みブールフラグがあれば私は興味があります。つまり、AngularJS自体は特定のブール値フラグをチェックすることでスコープを1回だけ破壊しますか? – stanleyxu2005

1

AngularのisolateScopeは、jQueryを使用するよりも優れています。おそらく、このようなあなたのテスト上記beforeEachの要素をまとめました:

myEl = '<div my-el>MY EL</div>'; 
scope = $rootScope.$new(); 
directiveElement = $compile(myEl)(scope); 
scope.$digest(); 

今すぐあなたのテストでは、あなたがisolateScopeにアクセスし、$destroyを呼び出すことができます。ここでは

var isolated = directiveElement.isolateScope(); 
isolated.$destroy(); 
0

は、私が何をすべきかです:

私はテストのために意味をなす フラグ変数、アルを作成する必要はありません他の回答とは異なり
var destroyed = spyOn(scope, '$destroy').and.callThrough(); 
scope.$destroy(); 
expect(destroyed).toHaveBeenCalled(); 

したがって、関数$ destryが正常に呼び出されているかどうかを確認するために、Jasmine spyOnとcallThroughを使用する方が理にかなっています。

関連する問題