Тестирование реагирующего хука, который обновляет токен по тайм-ауту - PullRequest
0 голосов
/ 07 апреля 2020
export const useRefreshingToken = ({ ixId, learnerId, registrationId }: UseRefreshingTokenProps) => {

     const [timeoutId, setTimeoutId] = useState<number | null>(null);

    const { error, loading, reload, result } = useFetchData(gqlSdk.getToken, {
        itemId,
        userId,
        registrationId,
    });

    // Effect to refresh token ${tokenRefreshOffsetSeconds} before it expires
    useEffect(() => {
        if (!result?.token) {
            return;
        }

        // if there is already a scheduled reload dont need to set it again
        if (timeoutId || loading) {
            return;
        }

        const id = window.setTimeout(() => {
            reload();
            setTimeoutId(null);
            // Multiply by 1000 to go from seconds to milliseconds
        }, getRefreshTimeInMilliseconds(result.token.lifetimeSeconds));
        setTimeoutId(id);
    }, [reload, result, timeoutId, loading]);

    return {
        authToken: result?.token.tokenValue,
        loading: loading,
        error: error,
    };

Я написал этот хук, который обновляет значение моего authtoken всякий раз, когда он истекает. Мне интересно, как я могу проверить refre sh logi c здесь.

Я могу протестировать с помощью библиотеки реагирования на крючки для первого рендера этого хука.

    it('Fetches a token from the gql api', async () => {
        mockedSdk.getToken.mockResolvedValueOnce({
            token: { lifetimeSeconds: 10, tokenValue: 'some-token' },
        });

        const { result, waitForNextUpdate } = renderHook(() =>
            useRefreshingToken({ id: 'ix1', userId: 'learner1', registrationId: 'registration1' }),
        );

        await waitForNextUpdate();

        expect(result.current.authToken).toEqual('some-token');
    });

Я попытался добавить кусок кода, ожидая сна (10), чтобы спать в течение 10 секунд, затем проверил значение результата ловушки. Однако это не похоже на работу. Вернее, происходит обновление состояния, но я могу выдавать ошибки о том, как я выполняю обновления состояния за пределами act ().

1 Ответ

0 голосов
/ 07 апреля 2020

Я понял это.

Я могу сделать

jest.useFakeTimers()
await act(async () => {
            jest.runAllTimers();
            await waitForNextUpdate();
        })

Чтобы подделать таймер и выполнить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...