我的商店的processAction()函数以“即发即忘”的方式调用私有异步函数,然后进行提取。 processAction()它本身不处理任何错误处理,并且在浏览器中,如果获取失败,外部库将处理所有未捕获的承诺拒绝。
因此,如果我模拟我的获取以拒绝,则私有函数(我正在测试的效果)将拒绝。由于我没有对异步函数调用创建的承诺的引用,因此我无法在测试中捕获拒绝,但测试失败,因为存在未处理的拒绝。
我怎样才能告诉 jest 接受这种调用私有函数本身的短时间,而不是仅仅触发调用它的操作?
动作.ts
const actions = {
doTheThing() {
dispatch({ type: 'DO_THE_THING' });
},
};
export default actions;
商店.ts
import fetch from './fetch';
class Store {
isFetching = false;
// ...
processAction({ type, payload }: { type: string, payload: any }) {
switch (type) {
case 'DO_THE_THING':
this.fetchTheThing();
break;
}
}
private async fetchTheThing() {
try {
this.isFetching = true;
const result = await fetch(myUrl);
// ...
} finally {
this.isFetching = false;
}
}
}
export default new Store();
__mocks__/fetch.ts
let val: any;
interface fetch {
__setVal(value: any): void;
}
export default async function fetch() {
return val;
}
fetch.__setVal = function(value: any) {
val = value;
};
商店.test.ts
import actions from './actions';
import store from './store';
const fetch = (require('./fetch') as import('./__mocks__/fetch')).default;
jest.mock('./fetch');
test('it sets/unsets isFetching on failure', async () => {
let rej: () => void;
fetch.__setVal(new Promise((_, reject) => rej = reject));
expect(store.isFetching).toBe(false);
Actions.doTheThing();
await Promise.sleep(); // helper function
expect(store.isFetching).toBe(true);
rej(); // <---- test fails here
await Promise.sleep();
expect(store.isFetching).toBe(false);
});
ABOUTYOU
qq_花开花谢_0
相关分类