marmelab/react-admin · error · Error

create is not implemented

Error message

create is not implemented

What it means

testDataProvider builds a DataProvider where every method throws by default, so tests must stub only the methods they need. Calling create without stubbing it hits the default throwing implementation — this is an intentional guard telling you the test didn't provide the behavior it exercised.

Source

Thrown at packages/ra-core/src/dataProvider/testDataProvider.ts:14

import { DataProvider } from '../types';

/**
 * A dataProvider meant to be used in tests only. You can override any of its methods by passing a partial dataProvider.
 *
 * @example
 * const dataProvider = testDataProvider({
 *    getOne: async () => ({ data: { id: 123, title: 'foo' }})
 * })
 */

const defaultTestDataProvider: DataProvider = {
    create: async () => {
        throw new Error('create is not implemented');
    },
    delete: async () => {
        throw new Error('delete not implemented');
    },
    deleteMany: async () => {
        throw new Error('deleteMany is not implemented');
    },
    getList: async () => {
        throw new Error('getList is not implemented');
    },
    getMany: async () => {
        throw new Error('getMany is not implemented');
    },
    getManyReference: async () => {
        throw new Error('getManyReference is not implemented');
    },
    getOne: async () => {
        throw new Error('getOne is not implemented');

View on GitHub (pinned to 051f511bb0)

Solutions

  1. Stub create in the test data provider: testDataProvider({ create: async () => ({ data: { id: 1 } }) })
  2. Switch the test to mockProvider (from ra-test or react-admin test utils) which implements create automatically
  3. If the test should not create anything, assert on the failure path or avoid triggering the mutation

Example fix

// before
const dataProvider = testDataProvider();
// after
const dataProvider = testDataProvider({
  create: async () => ({ data: { id: 123, title: 'foo' } }),
});
Defensive patterns

Strategy: try-catch

Validate before calling

if (!dataProviderOverrides.create) throw new Error('test must stub create');

Try / catch

try { await create(); } catch (e) { if (String(e.message).includes('not implemented')) { /* forgot to stub create */ } throw e; }

Prevention

When it happens

Trigger: Using useCreate / dataProvider.create() (or a <Create> view) in a test with a provider from testDataProvider() without passing a create implementation in the overrides object.

Common situations: Snapshot/RTL tests mounting a Create form against the default testDataProvider; forgetting that testDataProvider fails fast for unstubbed methods; copy-pasting a test setup from a read-only test suite.

Related errors


AI-assisted analysis of marmelab/react-admin@051f511bb0 (2026-08-30). Data as JSON: /api/errors/75a7a374b8e9cd0a. Report an issue: GitHub.