How to test on destroy scope

后端 未结 4 868
刺人心
刺人心 2021-02-13 19:02

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

I have the code in my directive:

scope.$on(\'$destroy\', function () {
    //clean som         


        
相关标签:
4条回答
  • 2021-02-13 19:15

    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.

    0 讨论(0)
  • 2021-02-13 19:16

    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.

    0 讨论(0)
  • 2021-02-13 19:17

    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!

    0 讨论(0)
  • 2021-02-13 19:22

    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();
    
    0 讨论(0)
提交回复
热议问题