比较两个数组时,单元测试equals()失败

时间:2011-10-05 08:46:12

标签: javascript unit-testing equals sproutcore

以下代码中的最后一次单元测试失败,可能是因为==使用的equals()运算符未正确比较数组。但是,我无法弄清楚为什么会发生这种情况。

为什么equals()在将从SC.Record检索到的数组与新实例化的数组进行比较时失败?

monster_model.js

BagOfTricks.Monster = SC.Record.extend(
{
  name: SC.Record.attr(String, { defaultValue: 'Unspecified' }),
  level: SC.Record.attr(Number, { defaultValue: 0 }),
  keywords: SC.Record.attr(Array, { defaultValue: function() { return [ 'Unspecified' ] } })
}
);

monster_test.js

var defaultMonster;

module("BagOfTricks.Monster", {
    setup: function() {
        defaultMonster = BagOfTricks.store.createRecord( BagOfTricks.Monster, {} );
    },
    teardown: function() {
        BagOfTricks.store.reset();
    }
}
);

test("Default monster created as expected?", function() {
    equals(defaultMonster.get('name'), 'Unspecified');
    equals(defaultMonster.get('level'), 0);

    // The following test fails.
    var defaultKeywordArray = ['Unspecified'];
    equals(defaultKeywordArray, defaultMonster.get('keywords'));
}
);

3 个答案:

答案 0 :(得分:1)

在比较数组时,JavaScript表现得非常奇怪。我不能告诉你为什么,但我可以告诉你如何避免

使用Breaking Par: JavaScript Are Arrays Equal中的第二个功能。

在大型阵列上,它是类型安全且速度非常快。

答案 1 :(得分:0)

你需要像ArrayEquals(在Java中)那样检查所有数组“组件”的等号。

答案 2 :(得分:0)

你为什么要这样做

keywords: SC.Record.attr(Array, { defaultValue: function() { return [ 'Unspecified' ] } })

只是做

keywords: SC.Record.attr(Array, { defaultValue: [ 'Unspecified' ] })

第一个导致在get属性上执行keywords而不是数组时返回函数。