Использование jest spyOn не может обнаружить методы, вызываемые внутри блока try-catch - PullRequest
0 голосов
/ 19 февраля 2020

Проблема в том, что Jest сообщает, что setResultsSpy вызывается 0 раз, хотя на самом деле я знаю, что он вызывается. Я знаю это, поместив console.log(results) в const results = await getFileList(data.path); в моем коде и смог увидеть возвращаемые результаты.

Сейчас я предполагаю, что блоки try-catch создают локальную область видимости, которая вызывает эти вызовы не быть зарегистрированным. Если это правда, мой вопрос «как я могу проверить, были ли вызваны эти методы»?

// test_myFunction.js

test((`myFunction with valid path should return list of files`), () => {
  const actions = {
    setMsg: () => { },
    setButton: () => {},
    setResults: () => {},
    setAppState: () => {}
  };
  const setMsgSpy = jest.spyOn(actions, 'setMsg');
  const setSubmitButtonStateSpy = jest.spyOn(actions, 'setButton');
  const setResultsSpy = jest.spyOn(actions, 'setResults');
  const setAppStateSpy = jest.spyOn(actions, 'setAppState');
  const returnedFileList = [
    'file1.pdf',
    'file2.pdf',
    'file3.pdf',
  ];
  const requestConfig = {
    component: COMPONENTS.myComponent,
    request: RequestTypes.REQUEST,
    data: {path: 'folder1'},
    actions
  };

  processRequest(requestConfig)

  expect(setMsgSpy).toHaveBeenCalledTimes(1);
  expect(setMsgSpy)
  .toHaveBeenCalledWith('loading');

  expect(setButtonSpy).toHaveBeenCalledTimes(1);

  expect(setResultsSpy).toHaveBeenCalledTimes(1);
  expect(setResultsSpy).toHaveBeenCalledWith(returnedFileList);

  expect(setAppStateSpy).toHaveBeenCalledTimes(1);
  expect(setAppStateSpy).toHaveBeenCalledWith('confirm');
});

_

// myFunction.js
async function processRequest({
  component,
  request,
  data,
  actions,
}){
  if (component === COMPONENTS.myComponent) {
    const path = data.path.trim();
    switch (request) {
      case RequestTypes.REQUEST:
        actions.setMsg('message');
        actions.setButton('disabled');

          try {
            const results = await getFileList(data.path);
            actions.setResults(results);
            actions.setAppState('confirm');
          } catch (e) {
            actions.setError(e);
            actions.setAppState('error');
          }
        }
        break;
      default:
        break;
    }
  }

1 Ответ

0 голосов
/ 20 февраля 2020

Проблема заключалась в том, что Jest не смог выйти из теста до завершения выполнения getFileList(), поскольку getFileList () является асинхронной c функцией.

Решение заключается в обработке теста выполнение асинхронно согласно документации . Есть 4 способа решить эту проблему:

  1. Использовать обратные вызовы
  2. Использовать .then() и .catch() для возвращенного обещания (см. Документы по .then() здесь и .catch() здесь )
  3. Используйте .resolves() или .rejects() Методы Jest на expect(), чтобы Jest разрешил обещание.
  4. Используйте Asyn c -Подождать синтаксиса, объявив тестовую анонимную функцию async и используя await на processRequest().

Я выбрал вариант 4, так как мне нравится использовать asyn c -await синтаксис , Вот решение:

// test_myFunction.js

test((`myFunction with valid path should return list of files`), async () => {
  //(all of the variables established from above)    

  await processRequest(requestConfig)

  expect(setMsgSpy).toHaveBeenCalledTimes(1);
  expect(setMsgSpy)
  .toHaveBeenCalledWith('loading');

  expect(setButtonSpy).toHaveBeenCalledTimes(1);

  expect(setResultsSpy).toHaveBeenCalledTimes(1);
  expect(setResultsSpy).toHaveBeenCalledWith(returnedFileList);

  expect(setAppStateSpy).toHaveBeenCalledTimes(1);
  expect(setAppStateSpy).toHaveBeenCalledWith('confirm');
});

Обратите внимание, async используется в первой строке и await при вызове processRequest(requestConfig).

...