Как протестировать область уничтожения

Как выполнить модульное тестирование события $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.