我在用Jest测试简单功能时遇到问题。
export const removeId = (obj, omitId) => {
Object.keys(obj).reduce((object, key) => {
if (key !== omitId) {
object[key] = obj[key];
}
return object;
}, {});
};
当我将此功能导入我的测试文件并运行时:
expect(removeId(state, 0)).toEqual(expected);
期望值未定义。
但是如果我在测试中声明该函数并像这样运行:
const removeId = Object.keys(state).reduce((object, key) => {
if (key !== '2') {
object[key] = state[key];
}
return object;
}, {});
expect(removeId).toEqual(expected);
很好。
答案 0 :(得分:1)
Taplar在评论中已经提供了正确的答案,但是我觉得您的问题来自对Object.keys在做什么的误解。如果那是不正确的,而这只是一个错字,请随时忽略本文的其余部分。首先,这是应该起作用的正确代码:
export const removeId = (obj, omitId) => {
return Object.keys(obj).reduce((object, key) => {
if (key !== omitId) {
object[key] = obj[key];
}
return object;
}, {});
};
但是为什么这样做有效,又为什么以前不起作用呢?我觉得您放了return object
,尽管那样就足够了。这还不够的原因是因为reduce
函数实际上正在使用闭包,这意味着它是一个完全不同的函数。为了理解这一点,我们可以像这样将代码分开:
export const removeId = (obj, omitId) => {
const innerFunction = (object, key) => {
if (key !== omitId) {
object[key] = obj[key];
}
return object;
};
Object.keys(obj).reduce(innerFunction, {});
};
现在请注意,带有reduce
函数的行基本上只是一条链式语句。我们正在调用它,但是对结果不做任何事情。
以另一种方式看待这个问题:
Object.keys(obj) -> returns an array, the contents of which are the
keys of the object that you put into it
array.reduce() -> calls a function for every element of the array. It returns
an object built from that function
因此,为了将reduce
函数的结果从您的removeId
函数发送回去,您需要将其返回,这是最重要的代码。
希望这是有道理的。