Проверьте функцию из файла редуктора с помощью Jest - PullRequest
0 голосов
/ 03 января 2019

У меня проблемы с тестированием простой функции с помощью 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 голосов
/ 03 января 2019

Правильный ответ уже был предоставлен Тапларом в комментарии, но у меня есть ощущение, что ваша проблема связана с неправильным пониманием того, что делает 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, вам необходимо вернуть его, что и делает верхний код.

Надеюсь, это имеет смысл.

...