rdc-react-testing
Provides testing utilities for mocking and validating components and hooks built with @data-client/react.
Install
mkdir -p .claude/skills/rdc-react-testing && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/4197" && unzip -o skill.zip -d .claude/skills/rdc-react-testing && rm skill.zipInstalls to .claude/skills/rdc-react-testing
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Test @data-client/react with renderDataHook and mountDataClient - jest unit tests, fixtures, interceptors, MockResolver, mock responses, nock HTTP mocking, fake timers for polling/subscription tests, DataProvider test setup, hook and component testing. Use when writing or debugging tests for hooks, components, or resources built on @data-client/react.Key capabilities
- →Render hooks for testing
- →Mock API responses
- →Test mutations and side effects
- →Simulate error states
- →Test manager middleware
How it works
It provides utilities like renderDataHook and MockResolver to simulate the Data Client store and intercept network requests during tests.
Inputs & outputs
When to use rdc-react-testing
- →Write unit tests for custom hooks
- →Mock API responses for component tests
- →Verify cache behavior in tests
- →Test loading and error states
About this skill
Testing Patterns (@data-client/test)
Hook Testing with renderDataHook()
import { renderDataHook } from '@data-client/test';
it('useSuspense() should render the response', async () => {
const { result, waitFor } = renderDataHook(
() => useSuspense(ArticleResource.get, { id: 5 }),
{
initialFixtures: [
{
endpoint: ArticleResource.get,
args: [{ id: 5 }],
response: { id: 5, title: 'hi ho', content: 'whatever' },
},
],
},
);
expect(result.current.title).toBe('hi ho');
});
Options:
initialFixtures- Set up initial state of the storeresolverFixtures- Add interceptors for subsequent requestsgetInitialInterceptorData- Simulate changing server state
Return values:
- Inherits all
renderHook()return values from@testing-library/react controller- Controller instance for manual actionsallSettled()- Wait for all async operations to complete
Cleanup is automatic -- an afterEach hook is registered at module load time that drains all active cleanups. No manual renderDataHook.cleanup() calls are needed.
Fixtures and Interceptors
Success Fixture:
interface SuccessFixture {
endpoint;
args;
response;
error?;
delay?;
}
Response Interceptor:
interface ResponseInterceptor {
endpoint;
response(...args);
delay?;
delayCollapse?;
}
Testing Mutations
Create operations:
it('should create a new todo', async () => {
const { result } = renderDataHook(
() => useController(),
{
initialFixtures: [
{
endpoint: TodoResource.getList,
args: [],
response: [],
},
],
resolverFixtures: [
{
endpoint: TodoResource.getList.push,
response: (newTodo) => ({ ...newTodo, id: 1 }),
},
],
},
);
const newTodo = { title: 'Test Todo', completed: false };
const createdTodo = await result.current.fetch(TodoResource.getList.push, newTodo);
expect(createdTodo.id).toBe(1);
});
Testing Error States
it('should handle fetch errors', async () => {
const { result, waitFor } = renderDataHook(
() => useSuspense(TodoResource.get, { id: 1 }),
{
initialFixtures: [
{
endpoint: TodoResource.get,
args: [{ id: 1 }],
response: null,
error: new Error('Not found'),
},
],
},
);
await waitFor(() => {
expect(result.current).toBeUndefined();
});
});
Testing Components
Use MockResolver to provide fixture data when rendering components with DataProvider:
import { render } from '@testing-library/react';
import { DataProvider } from '@data-client/react';
import { MockResolver } from '@data-client/test';
it('should render todo list', async () => {
const fixtures = [
{
endpoint: TodoResource.getList,
args: [],
response: [{ id: 1, title: 'Test Todo', completed: false }],
},
];
const { getByText } = render(
<DataProvider>
<MockResolver fixtures={fixtures}>
<TodoList />
</MockResolver>
</DataProvider>,
);
expect(getByText('Test Todo')).toBeInTheDocument();
});
Testing with nock (HTTP Endpoint Testing)
import nock from 'nock';
it('should fetch data from API', async () => {
const scope = nock('https://jsonplaceholder.typicode.com')
.get('/todos/1')
.reply(200, { id: 1, title: 'Test', completed: false });
const result = await TodoResource.get({ id: 1 });
expect(result.title).toBe('Test');
scope.done();
});
Testing Managers
it('should handle manager middleware', async () => {
const mockManager = {
middleware: (controller) => (next) => async (action) => {
if (action.type === 'FETCH') {
console.log('Fetch action:', action);
}
return next(action);
},
cleanup: jest.fn(),
};
const { controller } = renderDataHook(
() => useController(),
{ managers: [mockManager] },
);
await controller.fetch(TodoResource.get, { id: 1 });
expect(mockManager.cleanup).not.toHaveBeenCalled();
});
Test File Organization
Keep tests under packages/*/src/**/__tests__:
packages/react/src/hooks/__tests__/useSuspense.test.ts
packages/react/src/components/__tests__/DataProvider.test.tsx
Test naming:
- Node-only:
*.node.test.ts[x] - React Native:
*.native.test.ts[x] - Regular:
*.test.ts[x]
Best Practices
- Use
renderDataHook()for testing hooks that use @data-client/react hooks - Use fixtures or interceptors when testing hooks or components
- Use
nockwhen testing networking definitions - Test both success and error scenarios
- Test mutations and their side effects
- Don't mock @data-client internals directly
- Don't use raw fetch in tests when fixtures are available
- Don't manually call
renderDataHook.cleanup()inafterEach-- cleanup is automatic
References
For detailed API documentation, see the references directory:
- renderDataHook - Hook testing utility
- makeRenderDataHook - Custom hook renderer
- Fixtures - Fixture format reference
- MockResolver - Component testing wrapper
- mockInitialState - Create initial state
- unit-testing-hooks - Hook testing guide
- unit-testing-components - Component testing guide
When not to use it
- →Non-React testing environments
- →Testing logic unrelated to @data-client
Prerequisites
Limitations
- →Requires @data-client/react
- →Automatic cleanup is registered at module load
How it compares
It offers specialized testing utilities for Data Client hooks and components, avoiding the need for manual store mocking.
Compared to similar skills
rdc-react-testing side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| rdc-react-testing (this skill) | 1 | 3mo | Review | Advanced |
| ui-ux-expert-skill | 91 | 9mo | Review | Advanced |
| react-best-practices | 22 | 3mo | No flags | Intermediate |
| frontend-testing | 11 | 3mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by reactive
View all by reactive →You might also like
ui-ux-expert-skill
fercracix33
Technical workflow for implementing accessible React user interfaces with shadcn/ui, Tailwind CSS, and TanStack Query. Includes 6-phase process with mandatory Style Guide compliance, Context7 best practices consultation, Chrome DevTools validation, and WCAG 2.1 AA accessibility standards. Use after Test Agent, Implementer, and Supabase agents complete their work.
react-best-practices
redpanda-data
Client-side React performance optimization patterns.
frontend-testing
langgenius
Generate Vitest + React Testing Library tests for Dify frontend components, hooks, and utilities. Triggers on testing, spec files, coverage, Vitest, RTL, unit tests, integration tests, or write/review test requests.
ai-sdk
vercel
Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: "AI SDK", "Vercel AI SDK", "generateText", "streamText", "add AI to my app", "build an agent", "tool calling", "structured output", "useChat".
feature-flags
Use when feature flag tests fail, flags need updating, understanding @gate pragmas, debugging channel-specific test failures, or adding new flags to React.
playwright-validation
open-metadata
Use when validating UI changes in a branch require Playwright E2E testing. Reviews branch changes, validates UI with Playwright MCP, and adds missing test cases.