How to test on destroy scope

余生长醉 提交于 2021-02-06 15:31:27

问题


How to unit testing an $destroy event of a Directive in angularjs?

I have the code in my directive:

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

My test code:

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

    //expect everything done?
});

Any suggestion!


回答1:


You can select the DOM from the template of your directive and get the scope of it, then run $destroy().

Ex:

your tpl:

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

your test:

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

Hope help you!




回答2:


You should test the code that is executed within the $destroy event. Here's a contrived example using a controller:

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.




回答3:


Angular's isolateScope is preferable to using jQuery. You've probably compiled the element in a beforeEach above your test like this:

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

Now in your test you can access the isolateScope and call $destroy:

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



回答4:


Here is what I do:

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

unlike other answers I don't have to create flag variables that only make sense for testing, also, it makes more sense to me to use Jasmine spyOn and callThrough to check if the function $destry is being successfully called.



来源:https://stackoverflow.com/questions/19049227/how-to-test-on-destroy-scope

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!