
Security News
GitHub Actions Pricing Whiplash: Self-Hosted Actions Billing Change Postponed
GitHub postponed a new billing model for self-hosted Actions after developer pushback, but moved forward with hosted runner price cuts on January 1.
@testing-library/preact-hooks
Advanced tools
Simple and complete React hooks testing utilities that encourage good testing practices.
preact 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 testsFAQs
Simple and complete React hooks testing utilities that encourage good testing practices.
The npm package @testing-library/preact-hooks receives a total of 4,164 weekly downloads. As such, @testing-library/preact-hooks popularity was classified as popular.
We found that @testing-library/preact-hooks demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 16 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
GitHub postponed a new billing model for self-hosted Actions after developer pushback, but moved forward with hosted runner price cuts on January 1.

Research
Destructive malware is rising across open source registries, using delays and kill switches to wipe code, break builds, and disrupt CI/CD.

Security News
Socket CTO Ahmad Nassri shares practical AI coding techniques, tools, and team workflows, plus what still feels noisy and why shipping remains human-led.