2013-09-27 86 views
11

如何單元測試的$摧毀angularjs一個指令的事件?如何測試的破壞範圍

我的代碼在我的指令:

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事件中執行的代碼。下面是使用的控制器的人爲的例子:

測試

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

    // Act 
    $scope.$destroy(); 

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

控制器

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

Plunker here

+1

喜邁克爾!我認爲你的解決方案適用於控制器的範圍。我想在一個指令中測試$銷燬範圍。謝謝! –

+0

我認爲這是指令的相同解決方案。你能用你的代碼創建一個Plunker腳本嗎? –

+0

這很實用。我很好奇,如果有任何內置的布爾標誌來檢查狀態。換句話說,AngularJS本身只會通過檢查特定的布爾標誌來銷燬一次作用域? – stanleyxu2005

1

角的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(); 

不像其他的答案,我沒有創建標誌變量纔有意義進行測試,人所以,使用Jasmine spyOn和callThrough來檢查函數$ destry是否被成功調用會更有意義。