$ npm install @testing-library/preact-hookspreact port of the the @testing-library/react-hooks library.
@testing-library/react-hooks?Currently, due to the use of react-test-renderer, the react hooks testing library most likely will never be compatible with preact.
At the time of writing, a library did not exist to test preact hooks.
Install with your favorite package manager
yarn add -D @testing-library/preact-hooks
OR
npm install --save-dev @testing-library/preact-hooks
useCounter.tsimport { useState, useCallback } from 'preact/hooks';
const useCounter = () => {
const [count, setCount] = useState(0);
const increment = useCallback(() => setCount(c => c + 1));
return {
count,
increment
}
}
export default useCounter;
useCounter.test.tsimport { renderHook, act } from '@testing-library/preact-hooks';
import useCounter from './useCounter';
test('should increment counter', () => {
const { result } = renderHook(() => useCounter());
act(() => {
result.current.increment();
});
expect(result.current.count).toBe(1);
});
Sometimes, hooks may need access to values or functionality outside of itself that are provided by a context provider or some other HOC.
import { createContext } from 'preact'
import { useState, useCallback, useContext } from 'preact/hooks'
const CounterStepContext = createContext(1)
export const CounterStepProvider = ({ step, children }) => (
<CounterStepContext.Provider value={step}>{children}</CounterStepContext.Provider>
)
export function useCounter(initialValue = 0) {
const [count, setCount] = useState(initialValue)
const step = useContext(CounterStepContext)
const increment = useCallback(() => setCount((x) => x + step), [step])
const reset = useCallback(() => setCount(initialValue), [initialValue])
return { count, increment, reset }
}
In our test, we simply use CoounterStepProvider as the wrapper when rendering the hook:
import { renderHook, act } from '@testing-library/preact-hooks'
import { CounterStepProvider, useCounter } from './counter'
test('should use custom step when incrementing', () => {
const wrapper = ({ children }) => <CounterStepProvider step={2}>{children}</CounterStepProvider>
const { result } = renderHook(() => useCounter(), { wrapper })
act(() => {
result.current.increment()
})
expect(result.current.count).toBe(2)
})
@ts-nocheck flag from tests