Как протестировать область уничтожения
Как выполнить модульное тестирование события $destroy директивы в angularjs?
У меня есть код в моей директиве:
scope.$on('$destroy', function () {
//clean something
});
Мой тестовый код:
it('on destroy',function(){
scope.$destroy();
scope.$digest();
//expect everything done?
});
Любое предложение!
Ответы
Ответ 1
Вы можете выбрать DOM из шаблона своей директивы и получить ее объем, а затем запустить $destroy().
Пример:
ваш tpl:
"<div id='tuna'></div>"
ваш тест:
it('test on destroy', function(){
var isolateScope = $(element).find('#tuna').eq(0).scope();
isolateScope.$destroy();
})
Надеюсь помочь вам!
Ответ 2
Вы должны проверить код, который выполняется в событии $destroy
. Здесь надуманный пример с использованием контроллера:
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);
});
контроллер
app.controller('MainCtrl', function($scope) {
$scope.$on('$destroy', function() {
$scope.destroyed = true;
});
});
Plunker здесь.
Ответ 3
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();
Ответ 4
Вот что я делаю:
var destroyed = spyOn(scope, '$destroy').and.callThrough();
scope.$destroy();
expect(destroyed).toHaveBeenCalled();
В отличие от других ответов мне не нужно создавать переменные флагов, которые имеют смысл только для тестирования, а также имеет смысл использовать Jasmine spyOn и callThrough для проверки успешного вызова функции $destry.