我正在使用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();
});
答案 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
方法的间谍没有任何想法,那么这可以是解决方案。当然,这不是最好的。