2013-09-27 7 views
11

Как модульное тестирование события $ destroy в директиве в angularjs?Как протестировать область уничтожения

У меня есть код в моей директиве:

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

Мой тестовый код:

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

    //expect everything done? 
}); 

Любое предложение!

ответ

10

Вы можете выбрать DOM из шаблона своей директивы и получить его объем, а затем запустить $ destroy().

Ex:

ваш 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

привет Майкл! Я думаю, ваше решение для области в контроллере. Я хочу проверить $ destroy of scope в директиве. спасибо! –

+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.

Смежные вопросы