元素上的角度模拟方法

时间:2016-01-06 14:13:39

标签: javascript angularjs unit-testing jasmine mobiscroll

我正在测试一个指令,我使用库Mobiscroll。我知道Mobiscroll也有一个角度组件,但我现在使用旧版本的Mobiscroll库,所以我对此不感兴趣。

问题是,我想测试是否调用了元素上的方法,在本例中是mobiscroll方法。我有以下代码:我的指令的链接方法:

link: function (scope, element, attr) {
   var datepicker = element.find("input");

   scope.showDate = function () {           
       datepicker.mobiscroll('show');
   };
}

如果调用了datepicker.mobiscroll('show'),我想查看我的Jasmine测试。但是我不能在我的测试中为元素设置间谍,因为查找元素不会导致指令中链接方法中使用的完全相同的对象。例如,以下内容不起作用:

    targetElement = $compile(elementBluePrint)($scope);
    rootScope.$apply();
    var target = targetElement.find("input");
    spyOn(target, "mobiscroll").and.callThrough();

因为这不起作用,我如何在Angular Jasmine测试中监视mobiscroll方法?

1 个答案:

答案 0 :(得分:2)

jQuery(以及最终的jqLit​​e)元素的常见问题是每个元素都是一个包装DOM元素的新对象,

angular.element(element[0]) !== angular.element(element[0])

当修改其中一个(在这种情况下,属性被模拟函数替换)时,它不会影响另一个。对于要受影响的所有元素,应该模拟他们的原型:

spyOn(angular.element.prototype, "mobiscroll").and.callThrough();