Testing useDebugValue Hook Implementation in Preact
This test suite evaluates the useDebugValue hook implementation in Preact, focusing on its debugging and value formatting capabilities. The suite verifies the hook’s behavior both with and without options hooks, ensuring proper integration with Preact’s debugging infrastructure.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
preactjs/preact
hooks/test/browser/useDebugValue.test.js
import { createElement, render, options } from 'preact';
import { setupScratch, teardown } from '../../../test/_util/helpers';
import { useDebugValue, useState } from 'preact/hooks';
/** @jsx createElement */
describe('useDebugValue', () => {
/** @type {HTMLDivElement} */
let scratch;
beforeEach(() => {
scratch = setupScratch();
});
afterEach(() => {
teardown(scratch);
delete options.useDebugValue;
});
it('should do nothing when no options hook is present', () => {
function useFoo() {
useDebugValue('foo');
return useState(0);
}
function App() {
let [v] = useFoo();
return <div>{v}</div>;
}
expect(() => render(<App />, scratch)).to.not.throw();
});
it('should call options hook with value', () => {
let spy = (options.useDebugValue = sinon.spy());
function useFoo() {
useDebugValue('foo');
return useState(0);
}
function App() {
let [v] = useFoo();
return <div>{v}</div>;
}
render(<App />, scratch);
expect(spy).to.be.calledOnce;
expect(spy).to.be.calledWith('foo');
});
it('should apply optional formatter', () => {
let spy = (options.useDebugValue = sinon.spy());
function useFoo() {
useDebugValue('foo', x => x + 'bar');
return useState(0);
}
function App() {
let [v] = useFoo();
return <div>{v}</div>;
}
render(<App />, scratch);
expect(spy).to.be.calledOnce;
expect(spy).to.be.calledWith('foobar');
});
});