【问题标题】:How to unit test var variables如何对 var 变量进行单元测试
【发布时间】: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


【解决方案1】:

我不是很肯定,因为很难说出你的意图,如果你有任何其他全局变量,但我认为你的错误是你在它的范围之外使用activeItems。但又很难说,因为您可能有其他全局变量导致问题。如果activeItems 超出了它的范围,那么it 将在expectscopeexpect 再次出现错误。然后它不会影响数组,它将保持在showItem 期间编辑的状态

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2019-09-27
    相关资源
    最近更新 更多