【发布时间】:2014-12-08 10:59:42
【问题描述】:
我测试 Angular 应用程序。不过,这个事实在这里不应该很重要。 我要测试的函数如下所示:
$scope.showItem = function (item) {
if (item.selected) {
activeItems.push(item);
} else {
var index = _.indexOf(activeItems, items);
activeItems.splice(index, 1);
}
};
功能按需要工作。数组 activeItems 用于另一个函数,经过一些修改后将结果分配给范围。 行为是,如果未选择该项目,则将其添加到数组中。如果该项目已被选中,它将从数组中删除。
it('should remove an item from the array', function () {
var activeItems = [{id: 1, selected: false}, {id:2, selected: true}];
var item = {
id: 1,
selected: false
};
expect(activeItems.length).toEqual(2);
scope.showItem(item);
expect(activeItems.length).toEqual(1); // FAIL!
// expects do not work for var variables. would work, if activeItems is assigned to the scope
});
如果我将 activeItems 分配给范围(scope.activeItems 而不是 var activeItems),那么一切正常;但是,我认为如果变量不显示在视图中,则不应将其分配给范围。
第一个期望会起作用,因为它是在它块内定义的:
expect(activeItems.length).toEqual(2);
第二个不会:
expect(activeItems.length).toEqual(1);
但它适用于范围变量:
expect(scope.activeItems.length).toEqual(1);
我的问题是如何测试该 var 值?
【问题讨论】:
-
在我看来,您正在尝试测试您的方法的内部实现。退后一步,从业务/功能的角度考虑您的功能试图实现的目标,并据此编写测试。
-
另外,
activeItems是$scope在您当前的showItem实现中的一个属性,因此为了让您测试它实际上做了什么,请将其添加到范围中,否则它只是一个全局变量。其次,activeItems必须指定,因为您在两种选择情况下都使用它。 -
感谢您的 cmets(包括下面的@wyattbergeron1)。有人告诉我不要附加到不会显示在视图中的 $scope 变量。这就是为什么 activeItems 是一个全局变量而不是 $scope.activeItems。稍后在代码中 activeItems 用于构建另一个 $scope 数组,该数组已正确测试。您的回答确实有助于理解需要测试的内容。
标签: javascript angularjs jasmine var