npm test # Run tests
npm run test:watch # Watch mode
npm run test:coverage # Coverageimport { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
describe("MyComponent", () => {
test("does something", async () => {
const user = userEvent.setup();
render(<MyComponent />);
await user.click(screen.getByRole("button"));
expect(screen.getByText("Result")).toBeInTheDocument();
});
});import { setupZMKMocks } from "@cormoran/zmk-studio-react-hook/testing";
let mocks: ReturnType<typeof setupZMKMocks>;
beforeEach(() => {
mocks = setupZMKMocks();
});
// Success
mocks.mockSuccessfulConnection({ deviceName: "Test" });
// Error
mocks.mockFailedConnection("Error message");- Use semantic queries:
getByRole,getByLabelText,getByText - Use
userEvent, notfireEvent - Wait with
waitFor()orfindBy* - Reset mocks in
beforeEach() - Test behavior, not implementation
Context:
const mock = { isConnected: true };
render(
<Ctx.Provider value={mock}>
<Component />
</Ctx.Provider>,
);Hooks:
const { result } = renderHook(() => useHook());
await act(async () => {
await result.current.fn();
});Mock Components:
jest.mock("../../hooks/useHook");
const mockHook = useHook as jest.MockedFunction<typeof useHook>;
mockHook.mockReturnValue({ data: [] });import {
setupZMKMocks,
createMockZMKApp,
ZMKAppProvider,
} from "@cormoran/zmk-studio-react-hook/testing";components/
Component.tsx
__tests__/Component.test.tsx