使用Jest测试来自reducer文件的功能

时间:2019-01-03 18:08:01

标签: javascript reactjs redux jestjs

我在用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);

很好。

1 个答案:

答案 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函数发送回去,您需要将其返回,这是最重要的代码。

希望这是有道理的。