У меня есть ловушка, содержащая прослушиватель событий, который сбрасывает состояние до его начального значения.
import { useState, useEffect } from "react";
const useStateKinda = (initialValue) => {
const [value, setValue] = useState(initialValue);
useEffect(() => {
const resetState = (e) => {
console.info(e);
if (e.persisted) {
setValue(initialValue);
}
};
window.addEventListener("pageshow", resetState);
return () => window.removeEventListener("pageshow", resetState);
}, [initialValue]);
return [value, setValue];
};
export default useStateKinda;
Я пытаюсь протестировать раздел кода прослушивателя событий, но локально при регистрации e
я просто получаю Event { isTrusted: [Getter] }
, поэтому мое утверждение неверно из-за того, что e.persisted
не работает.
Есть ли простой способ поиздеваться над этим, так как мне немного сложно
test("hook", async () => {
const { result } = renderHook(() => useStateKinda("default state"));
// Initial State:
let [value, setValue] = result.current;
expect(value).toBe("default state");
// Setting State:
act(() => setValue("new value"));
[value] = result.current;
expect(value).toBe("new value");
// Resetting State:
// How do I force persisted to be true here?
window.dispatchEvent(new Event("pageshow", { persisted: true }));
[value] = result.current;
expect(value).toBe("default state");
});
Любая помощь была бы замечательной!
Я также продублировал этот проблема в песочнице здесь: https://codesandbox.io/s/testing-custom-hook-demo-forked-i567s?file=/src/useStateKinda.test.js:110-638
@EstusFlask именно то, что мне нужно, спасибо!
Ожидается, что e будет синтетическим событием, а не событием. Вы не можете предоставить какие-либо ключи, которые хотите, для конструктора событий. Попробуйте
Object.assign(new Event("pageshow"), { persisted: true })