我正在尝试测试一个使用 useEffect 和 setTimeout 的相对简单的自定义钩子。但是,我的测试失败了,我无法弄清楚出了什么问题。
这是钩子本身(useTokenExpirationCheck.ts)
import { useEffect } from 'react';
import { logout } from '../features/profile/profileSlice';
import { useAppDispatch } from '../store/hooks';
export default function useTokenExpirationCheck(exp: number): void {
const dispatch = useAppDispatch();
useEffect(() => {
if (exp) {
const timeToLogout = exp * 1000 - Date.now();
setTimeout(() => {
dispatch(logout());
}, timeToLogout);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [exp]);
}
和我的测试文件:
import { act, renderHook } from '@testing-library/react-hooks';
import useTokenExpirationCheck from './useTokenExpirationCheck';
jest.mock('../features/profile/profileSlice');
const logout = jest.fn();
const exp = Date.now() + 6000;
describe('Expiration token', () => {
test('should logout user', async () => {
jest.useFakeTimers();
act(() => {
renderHook(() => {
useTokenExpirationCheck(exp);
});
});
expect(logout).toHaveBeenCalledTimes(0);
jest.advanceTimersByTime(60000);
expect(logout).toHaveBeenCalledTimes(1);
});
});
我所知道的是 exp 变量没有传递给 useTokenExpirationCheck 函数(console.log 在函数内部显示 0,当它被执行时)。所以基本上,我什至没有接触到 useEffect 本身......有什么想法会出错吗?