unbind()方法不存在

时间:2014-11-10 10:21:25

标签: angularjs unit-testing karma-jasmine

我正在使用jasmine来测试由AngularJs运行的应用程序。我的功能很简单,它检查激活值并滚动。每当“滚动”卷的值时超过'激活'的价值。该函数应该是来自滚动事件的unbind。像:

scope.fA = function () {
  if (scroll >= activate) {
    angular.element($window).unbind('scroll', scope.fA);
  }
}; 

angular.element($window).bind('scroll', scope.fA); 

请告诉我spyOn(angular.element, 'unbind');expect(angular.element.unbind).toHaveBeenCalled();的正确语法 这就是我测试它的方式,这显然是错误的:

it('should call unbind method', function() {
  spyOn(angular.element, 'unbind');
  triggerEventOnElement('scroll', $window);
  expect(angular.element.unbind).toHaveBeenCalled();
});

1 个答案:

答案 0 :(得分:0)

测试一个函数是否有界是有点棘手的。事实上,我对正确的语法一无所知,但您可以使用其他方法进行测试。您最好创建一个临时变量并将其指定为scope.fA以进行滚动,而不是将scroll绑定到bind事件。像:

var refFA;
scope.FA = function () {
  if (scroll >= activate) {
   angular.element($window).unbind('scroll', refFA);
  }
};
refFA = scope.FA;
angular.element($window).bind('scroll', refFA);

然后,您可以更好地监视unbind,而不是监视scope.FA

spyOn(scope, 'FA');

然后检查函数是否已解除绑定只需向元素添加任何类,触发滚动并期望该类存在,然后删除该类并再次触发,然后期望该类不存在。是的,它似乎很复杂而且不清楚。但只需检查下面的最终代码:

var refFA;
scope.FA = function () {
  elem.addClass('fan-some-class');
  if (scroll >= activate) {
    angular.element($window).unbind('scroll', refFA);
  }
};
refFA = scope.FA;
angular.element($window).bind('scroll', refFA);

和测试:

it('should unbind method', function() {
  triggerEventOnElement('scroll', $window);
  expect(elem.hasClass('fan-some-class')).toBe(true);
  elem.removeClass('fan-some-class');
  triggerEventOnElement('scroll', $window);
  expect(elem.hasClass('fan-some-class')).toBe(false);
});

这是要编写的代码,但我想如果你对unbind方法的间谍没有任何想法,那么这可以是解决方案。当然,这不是最好的。