Jest Mock возвращает неопределенные вместо данных - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь смоделировать функцию и не уверен, что я делаю здесь неправильно. У меня есть эта функция "getGroups"

getGroups:

export const getGroups = async () => {
  try {
    const groupApiUrl = getDashboardPath(GROUPS_TAB_INDEX);
    const data = await fetch(groupApiUrl, { cache: 'force-cache' });
    const userData = await data.json();
    return userData;
  } catch (error) {
    throw Error(error);
  }
};

___ mocks ___ / getGroups. js:

export default async () => {
  return {
    groups: [
      { id: 1, name: 'Data1' },
      { id: 2, name: 'Data2' }
    ]
  };
};

getGroups.test. js:

jest.mock('./getGroups.js');
// eslint-disable-next-line import/first
import { getGroups } from './getGroups';

const fakeRespose = {
  groups: [
    { id: 1, name: 'Data1' },
    { id: 2, name: 'Data2' }
  ]
};

describe('getGroups', () => {
  it('returns data', async () => {
    const data = await getGroups();
    console.log('DATA', data);  <---- UNDEFINED?
    expect(data).toBeDefined();
    expect(data).toMatchObject(fakeRespose);
  });

  it('handles error', async () => {
    // const data = await getGroups();
    await getGroups().toThrow('Failed');
  });
});

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Что вы здесь не так делаете?

  1. Экспорт по умолчанию в вашем макете вместо имени, как в реализации

В вашей реализации вы Вы используете именованный экспорт, и вы импортируете { getGroups }, поэтому, чтобы он заработал, вам нужно изменить свой макет следующим образом

__mocks__\getGroups.js
export const getGroups = async () => {
  return {
    groups: [
      { id: 1, name: 'Data1' },
      { id: 2, name: 'Data2' }
    ]
  };
};

рабочий пример


TL; DR

Тестирование макета

Нет смысла тестировать макет функции. Это не доказывает, что ваша реализация работает. Даже если вы измените свою реализацию, ваши тесты все равно пройдут.

Используйте mocks только для зависимостей вашей реализации

Использовать jest.genMockFromModule Он создаст jest.fn() для каждого из экспортируемых методов модуля и сохранит константы, что позволит вам изменить возвращаемое значение / реализацию для некоторых тестовых случаев, а также сможет написать утверждения, если функция была вызвана __mocks__\getGroups.js
const mock = jest.genMockFromModule('../getGroups');
mock.getGroups.mockResolvedValue({
  groups: [
    { id: 1, name: 'Data1' },
    { id: 2, name: 'Data2' }
  ]
})

module.exports = mock;
Jest автоматически поднимет вызовы jest.mock ( подробнее ... )

Таким образом, вы можете сначала безопасно оставить операторы импорта, а затем позвонить jest.mock

0 голосов
/ 30 марта 2020

Из Jest Docs, вот пример Mock.

jest.mock('../moduleName', () => {
  return jest.fn(() => 42);
});

// This runs the function specified as second argument to `jest.mock`.
const moduleName = require('../moduleName');
moduleName(); // Will return '42';

В вашем случае data не определено, потому что вы на самом деле не предоставили имитированную реализацию для функции, или mock hasn ' Это сработало, и вы все еще вызываете исходную функцию.

Пример ссылки: https://jestjs.io/docs/en/jest-object#jestmockmodulename -factory-options

Однако в вашем простом случае вы также можете решить это со шпионом, либо jest.spyOn, либо jest.fn(). Вот два решения того, чего вы пытаетесь достичь. Вы можете посмотреть код и запустить его здесь: https://repl.it/repls/FairUnsungMice

ОБНОВЛЕНИЕ после комментария:

Ручные макеты определяются запись модуля в подкаталоге __mocks__/, непосредственно примыкающем к модулю. Например, чтобы смоделировать модуль с именем user в каталоге моделей, создайте файл с именем user. js и поместите его в каталог models/__mocks__. Обратите внимание, что папка __mocks__ чувствительна к регистру, поэтому в некоторых системах наименование каталога __MOCKS__ будет прерываться.

Дважды проверьте наименование, структуру каталогов и тип экспорта, который вы настроили - они должны совпадать. Также стоит проверить это: https://github.com/facebook/jest/issues/6127 - похоже на открытую проблему с шуткой. Если вам нужно решение, посмотрите на использование другого подхода, как я уже говорил.

Ссылка: https://jestjs.io/docs/en/manual-mocks

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...