Не удалось выполнить тест после добавления, затем перехватить обещание - PullRequest
0 голосов
/ 26 марта 2019

У меня есть следующий (упрощенный для упрощения задачи) код:

function pushPromises() {
  const promises = [];

  promises.push(firstPromise('something'))
  promises.push(secondPromise('somethingelse'))

  return promises;
}

export default handlePromises(async (c) => {
  const results = await Promise.all(pushPromises())
  c.success(results);
});

Мой тест проверяет эти firstPromise и secondPromise, чтобы проверить, были ли они вызваны с правильными аргументами.Это работает (предположим, что установка макета выполнена правильно):

jest.mock('src/firstPromise');
jest.mock('src/secondPromise');

describe('test', () => {
  let firstMock;
  let secondMock;


  beforeEach(() => {
    require('src/firstPromise').default = firstMock;
    require('src/secondPromise').default = secondMock;
  })

  it('test', async () => {
    await handlePromises(context);
    expect(firstPromiseMock).toHaveBeenCalledTimes(1);
    expect(secondPromiseMock).toHaveBeenCalledTimes(1);
  });
});

Теперь, если я добавлю обработчики к обещаниям, таким как:

function pushPromises() {
      const promises = [];

      promises.push(
        firstPromise('something')
        .then(r => console.log(r))
        .catch(e => console.log(e))
      )
      promises.push(
        secondPromise('somethingelse')
        .then(r => console.log(r))
        .catch(e => console.log(e))
      )

      return promises;
    }

Первое ожидание проходит, но второеникто неПохоже, второе обещание больше не вызывается.

Как я могу изменить тест / код, чтобы добавление обработчиков в обещаниях не приводило к разрыву теста?Похоже, что он просто завершает выполнение на первом обработчике обещаний и никогда не попадает на второй.

РЕДАКТИРОВАТЬ:

Я изменил функцию, чтобы возвращать Promise.all без ожидания:

 export default handlePromises(async (c) => {
      return Promise.all(pushPromises())
 });

Но у меня точно такая же проблема.Второе обещание не вызывается, если у первого есть .then.

Ответы [ 2 ]

1 голос
/ 26 марта 2019

В вашем редакторе ваш handlePromises все еще не обещание ..

Попробуйте следующее. ->

it('test', async () => {
  await Promise.all(pushPromises());
  expect(firstPromiseMock).toHaveBeenCalledTimes(1);
  expect(secondPromiseMock).toHaveBeenCalledTimes(1);
});
0 голосов
/ 26 марта 2019

Ваша функция handlePromises принимает обратный вызов, но вы обрабатываете его, поскольку он возвращает обещание, это не очень хороший способ, но вы можете протестировать свой метод с помощью обратного вызова следующим образом

Изменить свой тест как =>

it('test', (done) => {
    handlePromises(context);
    context.success = (results) => {
        console.log(results)
        expect(firstPromiseMock).toHaveBeenCalledTimes(1);
        expect(secondPromiseMock).toHaveBeenCalledTimes(1);
        done();
    }
});

Или измените свой код как =>

function pushPromises() {
  const promises = [];

  promises.push(firstPromise('something'))
  promises.push(secondPromise('somethingelse'))

  return promises;
}

export default handlePromises = (context) => {
  return Promise.all(pushPromises()).then((data) => context.success(data))
};

//with async
export default handlePromises = async (context) => {
  let data = await Promise.all(pushPromises());
  context.success(data)
};
...