Jasmine模拟Karma和Angular的链式方法
Jasmine mock chained methods with Karma and Angular
我想模拟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:undefined不是对象(正在评估'angular.element("#thing-"+things[i].id).attr')
我还希望我的测试有这样的东西:
expect(angular.element.attr.calls.count()).toBe(1);
expect(angular.element.attr).tohaveBeenCalledWith("foo", things[0].bar);
监视或模拟链式方法的方式完全取决于它们在监视对象上的定义方式。
在Angular jqLite的情况下,或者在您的情况下:jQuery(两者都通过angular.element
facade透明地提供服务)在构造函数原型上定义了链式方法,该方法在工厂函数上公开为angular.element.prototype
或jQuery.prototype
(加载jQuery时为angular.element === jQuery
)。
为了监视angular.element
和angular.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
在这种情况下很重要,因为否则整个链都应该手动断开。
尝试添加以下代码:
var spy;
beforeEach(function() {
spy = spyOn(angular, 'element').....
});
afterEach(function() {
spy.andCallThrough();
});
您可以在以下位置找到更多信息:Jasmin docs
相关文章:
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 如何防止Angular方法多次激发
- 如何避免在angular上多次调用方法;s ng重复
- 他们是如何使用angular/jqLite find()方法按属性名称和值选择元素的?ng conf 2015
- 当输入字段为空时,如何在angular中调用方法
- Angular:如何在状态更改时调用scope方法
- 向通过ReST JSON调用生成的Angular Javascript对象添加方法
- 如何从其他方法访问Angular.js$scope
- 在Angular JS中POST后重新加载指令方法
- Angular Provider/JS-如何访问'叔叔方法'从$http().then()
- 什么'是从对象列表中一次编辑一个对象的正确Angular/Firebase方法
- 有没有一种方法可以使用angular中的$index作为ng重复中的模型
- 有没有一种方法可以基于Angular 2中注册的路线构建动态导航/菜单
- 为什么我在 Angular JS 中收到两个方法调用
- 如何:在JavaScript对象中声明的Angular Factory方法
- angular.js:13424 ReferenceError:在控制器中使用工厂方法时未定义索引
- angular ui下拉切换[object object]没有方法父级
- 从angular js中的另一个ng应用程序调用方法
- 正确的方法-Angular JS中指令之间的通信
- 过滤方法-Angular.JS