2013-09-27 5 views
11

Jak przeprowadzić testowanie zdarzenia $ destroy dyrektywy w angularjs?Jak testować w zakresie niszczenia

mam kod w moim dyrektywy:

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

Mój kod testowy:

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

    //expect everything done? 
}); 

Wszelkie sugestie!

Odpowiedz

10

Możesz wybrać DOM z szablonu swojej dyrektywy i uzyskać jego zakres, a następnie uruchomić $ destroy().

Ex:

Twój tpl:

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

nasz test:

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

Nadzieja pomóc!

+0

Mam to! podziękować. –

+0

serdecznie zapraszamy! –

10

Należy przetestować kod, który jest wykonywany w ramach zdarzenia $destroy. Oto zmyślony przykład za pomocą kontrolera:

test

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

    // Act 
    $scope.$destroy(); 

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

Controller

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

Plunker here.

+1

Witaj, Michael! Myślę, że twoje rozwiązanie dla zakresu w kontrolerze. Chcę test $ destroy zakresu w dyrektywie. podziękować! –

+0

Myślę, że to takie samo rozwiązanie dla dyrektywy. Czy mógłbyś stworzyć skrypt Plunkera za pomocą swojego kodu? –

+0

Jest to praktyczne. Jestem ciekawy, czy istnieje wbudowana flaga boolowska do sprawdzenia stanu. Innymi słowy, AngularJS sam zniszczy zakres tylko raz, sprawdzając konkretną flagę boolowską? – stanleyxu2005

1

Angular to isolateScope jest lepszy niż przy użyciu jQuery. Pewnie skompilowany element w beforeEach powyżej testu tak:

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

Teraz w teście można uzyskać dostęp do isolateScope i nazywają $destroy:

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

Oto co robię:

var destroyed = spyOn(scope, '$destroy').and.callThrough(); 
scope.$destroy(); 
expect(destroyed).toHaveBeenCalled(); 

przeciwieństwie do innych odpowiedzi nie mam do tworzenia flagi zmienne, które mają sens tylko do testów, al więc bardziej sensowne jest używanie Jasmine spyOn i callThrough do sprawdzania, czy funkcja $ destry została pomyślnie wywołana.