【发布时间】:2020-08-16 11:20:13
【问题描述】:
我有一个 React 钩子组件,onChange 事件将执行 aync-await 函数和一些调度,在我的模型测试中,如果我将 await function 放在任何调度之前,则未检测到 store.dispatch 被调用,如果我将调度放在等待函数之前,它只会检测到被调用,例如
const onChange = async (userId) => {
await someAsyncFn(userId);
dispatch(selectUser(userId)); //not detected
dispatch(selectGroup(userId); //not detected
};
--Test.js
expect(store.dispatch).toHaveBeenCalledTimes(2) ---failed, only receive 0 times
但如果我在调度后放置了等待,则测试用例通过了
const onChange = async (userId) => {
dispatch(selectUser(userId)); //detected
dispatch(selectGroup(userId); //detected
await someAsyncFn(userId);
};
--Test.js
expect(store.dispatch).toHaveBeenCalledTimes(2) ---passed receive 2 times
但是,如果我在调度之间放置了等待,则只会检测到上面的调度
const onChange = async (userId) => {
dispatch(selectUser(userId)); //detected
await someAsyncFn(userId);
dispatch(selectGroup(userId); //not detected
};
--Test.js
expect(store.dispatch).toHaveBeenCalledTimes(2) ---failed, only detect selectUser being called
当我运行我的应用程序时,上述 3 种情况之间的 UI 行为没有真正的区别,调度和我的等待功能都发生了,但我有点困惑,为什么我的测试用例无法检测到我的派遣?有没有办法绕过或强制从测试用例中解决我的 await 方法?
【问题讨论】:
-
并且您确定承诺正在解决或拒绝...?可能是承诺没有被拒绝或解决。 (可能是超时并破坏了代码?)
-
在实际应用中它已解决,但您指的是在 Jest 测试中执行时?有没有办法绕过异步等待?
-
我已经模拟了要使用
mockResolvedValue解决的异步函数,并且我可以测试以验证正在调用的异步函数,但是调度似乎仍然没有触发 -
请发布所有相关代码。见stackoverflow.com/help/mcve。不知道发生了什么事。它在一种情况下有效而在另一种情况下无效,这表明某处存在竞争条件,并且可以通过
await延迟来避免。
标签: javascript async-await jestjs react-hooks enzyme