【发布时间】:2018-06-28 20:09:11
【问题描述】:
我正在使用 Jest 测试库来测试一个调用回调的函数,该回调采用两个参数,element[i] 和 i。
这是我要测试的功能:
const each = (elements, cb) => {
for (let i = 0; i < elements.length; i++) {
cb(elements[i], i);
}
};
我知道数组只会有数字,所以在测试函数中我试图让回调简单地将索引添加到数组中的每个数字;例如,它应该将[1, 2, 3, 4] 的数组更改为[1, 3, 5, 7]。
这是我尝试做的:
const arrayFunctions = require('./arrays');
describe('Arrays', () => {
it('each', () => {
const callBack = (elem, indx) => {
elem += indx;
}
const arr = [1, 2, 3, 4];
arrayFunctions.each(arr, callBack);
expect(arr).toEqual([1, 3, 5, 7]);
})
});
这是我得到的错误:
Received:
[1, 2, 3, 4]
Difference:
- Expected
+ Received
Array [
1,
+ 2,
3,
- 5,
- 7,
+ 4,
]
15 | const arr = [1, 2, 3, 4];
16 | arrayFunctions.each(arr, callBack);
> 17 | expect(arr).toEqual([1, 3, 5, 7]);
| ^
18 | })
19 | });
20 |
at Object.it (advanced-javascript/arrays.spec.js:17:21)
为什么它没有按预期修改数组?再举一个更简单的例子,为什么会这样:
const arr = [1, 2, 3, 4];
for (let i = 0; i < arr.length; i++) {
arr[i] += i;
}
console.log(arr) // [1, 3, 5, 7];
虽然这不是?
const arr = [1, 2, 3, 4];
each(arr, callBack);
console.log(arr); // [1, 2, 3, 4];
【问题讨论】:
-
数字是不可变的。分配参数不会影响数组。
-
听起来好像您正试图让
each更像map。map是关于转换值。each是关于创建副作用的。你在找哪个? (我假设你明白这些已经内置在 `Array.prototype 中。) -
@ScottSauyet 我是 Lambda 学校的学生,目前正在使用 JavaScript 进行 Jest 测试;我知道数组的内置方法,但是为了这个练习,是的,我试图让
each函数更像map。有什么建议吗? -
嗯,我不知道你的ˋeachˋ 是否正确,但我知道测试没有问正确的问题。其他 cmets 和答案应该会引导您朝着正确的方向前进。
标签: javascript arrays callback jestjs