繁体   English   中英

React-Redux:Jest 未能测试异步操作(始终通过)

[英]React-Redux: Jest failing to test async action (Always pass)

我正在使用 Jest 为一些 Redux 操作实现单元测试。

然而,出于某种原因,这个测试用例永远不会失败。

该操作的汇总版本如下所示:

export function attachFile(file) {
  return (dispatch, getState) => {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = () => {
        dispatch({
          type: actionTypes.ATTACH_FILE_DONE,
          file: {
            content: reader.result,
            size: file.size,
            mimeType: file.type,
            name: file.name,
          },
        });
        resolve();
      };
      reader.onerror = (error) => {
        const errorMessage = `Error reading file: ${file.name}: ${error}`;
        dispatch({
          type: actionTypes.ATTACH_FILE_FAIL,
          errorMessage,
        });
        reject(errorMessage);
      };
      reader.readAsDataURL(file);
    });
  };
}

测试它的笑话代码:

store.dispatch(attachFile(file)).then(() => {
  console.log('ACTUAL ACTIONS:', store.getActions());
  console.log('EXPECTED ACTIONS:', expectedActions);
  expect(store.getActions()).toEqual(expectedActions);
})

记录信息显示值不相等,但是, Jest始终通过此测试。 我什至尝试添加

fail('Just fail')

但是测试仍然通过,即使数据完全不同或强制失败。

我环顾四周以查看类似的代码,但我看不到我的代码有任何有意义的差异,例如这个

我还注释掉了 Promise 中的所有代码,并强制它在测试代码上失败......仍然通过。

知道可能有什么问题吗?

一旦您的代码完成执行,就认为测试已经完成。

您需要告诉 Jest 等到您的承诺兑现。

您可以通过将参数(让我们称之为done )传递给您的test|it函数来done这一点,这样,Jest 将等到done被调用。

所以基本上是这样的:

test('the data is peanut butter', done => {
  function callback(data) {
    expect(data).toBe('peanut butter');
    done();
  }

  fetchData(callback);
});

对于您的示例,请在您的except之后调用done

{
    ...
    expect(store.getActions()).toEqual(expectedActions);
    done();
}

来源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM