React-Admin Test Utilities

3.19.12 · active · verified Tue Apr 21

The `ra-test` package provides specialized utilities for efficiently testing applications built upon `react-admin`, a widely adopted frontend framework for developing administrative interfaces with React. As of early 2026, the current stable version of `react-admin` (and consequently `ra-test`, which is part of the same monorepo) is 5.14.6, characterized by a continuous release cadence with frequent minor updates and bug fixes. This library is specifically tailored to address the complexities of testing `react-admin` components, particularly custom views or logic that depend on the framework's intricate Redux store and React Router context. Unlike general React testing libraries, `ra-test` offers pre-configured wrappers like `TestContext` and helpers such as `renderWithRedux` that seamlessly provide the necessary `react-admin` environment, enabling developers to focus on the specific logic of their custom components rather than boilerplate setup. It differentiates itself by providing a robust, opinionated testing environment integrated deeply with `react-admin`'s architecture, making it easier to mock the `react-admin` state and dispatch actions for focused unit or integration tests within the ecosystem.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to use `TestContext` to wrap a custom `react-admin` component, providing the necessary Redux and routing contexts for unit testing with `@testing-library/react`. It shows how to pass default props and simulate user interactions.

import * as React from "react";
import { TestContext } from 'ra-test';
import { render, fireEvent, screen } from '@testing-library/react';

// Imagine this is your custom react-admin Edit view component
const MyCustomEditView = ({ basePath, id, resource }) => {
    const handleClick = () => {
        // In a real app, this might dispatch an action or navigate
        console.log(`Action for resource ${resource} with ID ${id} at ${basePath}`);
    };
    return (
        <div data-testid="my-custom-edit-view">
            <h1>Edit {resource} #{id}</h1>
            <p>Base Path: {basePath}</p>
            <button onClick={handleClick}>Perform Action</button>
        </div>
    );
};

describe('MyCustomEditView', () => {
    const defaultEditProps = {
        basePath: '/posts',
        id: '123',
        resource: 'posts',
    };

    it('should render the custom edit view with provided props', () => {
        render(
            <TestContext enableReducers>
                <MyCustomEditView {...defaultEditProps} />
            </TestContext>
        );
        expect(screen.getByText('Edit posts #123')).toBeInTheDocument();
        expect(screen.getByText('Base Path: /posts')).toBeInTheDocument();
    });

    it('should simulate a button click', () => {
        const consoleSpy = jest.spyOn(console, 'log');
        render(
            <TestContext enableReducers>
                <MyCustomEditView {...defaultEditProps} />
            </TestContext>
        );
        fireEvent.click(screen.getByText('Perform Action'));
        expect(consoleSpy).toHaveBeenCalledWith('Action for resource posts with ID 123 at /posts');
        consoleSpy.mockRestore();
    });
});

view raw JSON →