添加后测试失败并承诺

时间:2019-03-26 10:10:42

标签: javascript promise mocking jestjs

我有以下代码(为缩小问题范围而简化):

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上添加处理程序不会导致测试中断?看起来它只是在第一个promise处理程序上完成执行,而从未执行到第二个promise处理程序。

编辑:

我修改了该函数以不等待就返回Promise.all:

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

但是我遇到了完全相同的问题。如果第一个承诺具有.then,则不会调用第二个承诺。

1 个答案:

答案 0 :(得分:0)

您的handlePromises函数接受回调,但是您正在处理它,因为它返回了一个Promise,这不是一个好方法,但是您可以按照以下方法使用回调来测试您的方法

将测试修改为=>

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)
};