如何使用 Promise.all 使用 jest 为多个提取设置测试

Posted

技术标签:

【中文标题】如何使用 Promise.all 使用 jest 为多个提取设置测试【英文标题】:How to set a test for multiple fetches with Promise.all using jest 【发布时间】:2017-12-04 11:47:40 【问题描述】:

我正在使用 jest 进行测试。我正在使用 react 和 redux,我有这个动作:

function getData(id, notify) 
 return (dispatch, ...) => 
   dispatch(anotherFunction());
   Promise.all(['resource1', 'resource2', 'resource3'])
   .then(([response1,response2,response3]) => 
        // ... handle responses
    )
   .catch(error =>  dispatch(handleError(error)); 
 ;

我一直在寻找 jest 文档如何为此操作设置测试,但我找不到方法。我自己尝试过这样的事情:

it('test description', (done) => 
  const expectedActions = [type: ..., payload: ...,type: ..., payload: ...,...];
  fetchMock.get('resource1', ...);
  fetchMock.get('resource2', ...);
  fetchMock.get('resource3', ...);
  // ... then the rest of the test calls
);

不成功。那我应该怎么做呢?

【问题讨论】:

【参考方案1】:

您可以通过在回调中返回 Promise 来告诉 Jest 等待 Promise 解决。有关更多信息,请参阅此部分 here。

it('should fetch some food', () => 
  const fetchItem1 = () => fetchData1().then(data => 
    expect(data).toBe('peanut butter');
  )
  const fetchItem2 = () => fetchData2().then(data => 
    expect(data).toBe('boiled egg');
  )
  const fetchItem3 = () => fetchData3().then(data => 
    expect(data).toBe('fried salad');
  )

  return Promise.all([fetchItem1(), fetchItem2(), fetchItem3()])
    .then(() => runOtherTests());
);

【讨论】:

【参考方案2】:

要使用Promise.all,您可以执行以下操作

test('Testing Stuff', async (done) => 

  const expectedActions = [ foo: ..., bar: ... ,  foo: ..., bar: ... ];

  // we pass the index to this function 
  const asyncCall = async (index) => 
    // check some stuff
    expect(somestuff).toBe(someOtherStuff);
    // await the actual stuff
    const response = await doStuff( expectedActions[index] );
    // check the result of our stuff
    expect(response).toBe(awesome);
    return response;
  ;

  // we put all the asyncCalls we want into Promise.all 
  const responses = await Promise.all([
    asyncCall(0),
    asyncCall(1),
    ...,
    asyncCall(n),
  ]);

  // this is redundant in this case, but wth
  expect(responses).toEqual(awesome);

  done();

);

【讨论】:

以上是关于如何使用 Promise.all 使用 jest 为多个提取设置测试的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Promise.all 方法? [关闭]

如何返回 Promise.all 获取 api json 数据?

如何使用Promise.All()执行异步诺言?

如何使用 Promise.all 获取 URL 数组?

理解Promise.all,Promise.all与Promise.race的区别,如何让Promise.all在rejected后依然返回resolved状态

使用 Promise.all() 在 Promise 实现时执行操作