[AngularJS]茉莉花模拟链接的方法与业力和角

发布时间: 2017/4/16 11:05:08
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想要嘲笑 angular.element 。我想要确保 angular.element 一定量的时代,被称为 anguler.element.attr 也被称为。

我有以下代码︰

var things = $scope.getThings();

for (var i = 0; i < things.length; i++) {
  if (things[i].type == "xyz") {
    angular.element("#thing-" + things[i].id)
      .attr("foo", things[i].bar);
  };
};

我有我的测试︰

var things = [
  {
    id: 1,
    type: "xyz",
    bar: 10
  },
  {
    id: 2,
    type: "abc",
    bar: 33
  }
];

spyOn($rootScope, "getThings").and.returnValue(things);
spyOn(angular, "element").and.returnValue();

$rootScope.doThings(); // call controller method

expect(angular.element.calls.count()).toBe(1);

但它给出了以下错误︰

TypeError︰ 未定义不是一个对象 (评价 ' 角有限 ("#thing-"+ things[i].id).attr')

我也想要我的测试有像︰

expect(angular.element.attr.calls.count()).toBe(1);
expect(angular.element.attr).tohaveBeenCalledWith("foo", things[0].bar);

解决方法 1:

链接的方法应该监视或只是嘲笑的方式取决于他们如何定义的间谍的对象上。

角的 jqLite,或在您的情况下,jQuery (两者都以透明方式是通过 angular.element 门面) 链接的方法定义构造函数原型,暴露在工厂函数作为 angular.element.prototypejQuery.prototype ( angular.element === jQuery jQuery 加载时)。

来暗中监视两个 angular.elementangular.element(...).attr 它应该是︰

spyOn(angular, 'element').and.callThrough();
spyOn(angular.element.prototype, 'attr').and.callThrough();
...
expect(angular.element).toHaveBeenCalled();
expect(angular.element.prototype.attr).toHaveBeenCalled();

callThrough很重要,在这种情况下因为否则应手动绊整个链。

赞助商