以下代码中的最后一次单元测试失败,可能是因为==
使用的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'));
}
);
答案 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
而不是数组时返回函数。