13

如何在 angularjs 中对指令的 $destroy 事件进行单元测试?

我的指令中有代码:

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

我的测试代码:

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

    //expect everything done?
});

任何建议!

4

4 回答 4

11

您应该测试在$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在这里

于 2013-09-28T22:15:32.107 回答
10

您可以从指令的模板中选择 DOM 并获取它的范围,然后运行 ​​$destroy()。

前任:

你的 tpl:

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

你的测试:

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

希望能帮到你!

于 2013-10-02T03:43:08.103 回答
1

AngularisolateScope比使用 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();
于 2016-05-02T15:38:55.810 回答
0

这是我所做的:

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

与其他答案不同,我不必创建仅对测试有意义的标志变量,而且,使用 Jasmine spyOn 和 callThrough 来检查函数 $destry 是否被成功调用对我来说更有意义。

于 2017-03-29T19:15:08.073 回答