marmelab/react-admin · error · Error

deleteMany is not implemented

Error message

deleteMany is not implemented

What it means

Like all testDataProvider defaults, deleteMany throws unless explicitly overridden. It fails the test immediately rather than returning fake data, so tests only pass when they define the behavior they depend on.

Source

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

/**
 * 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');
    },
    update: async () => {
        throw new Error('update not implemented');
    },
    updateMany: async () => {
        throw new Error('updateMany not implemented');

View on GitHub (pinned to 051f511bb0)

Solutions

  1. Stub deleteMany: testDataProvider({ deleteMany: async () => ({ data: [123, 456] }) })
  2. Switch to mockProvider which returns sensible defaults for all methods
  3. Assert only on single-record delete paths if bulk behavior isn't the target

Example fix

// before
const dataProvider = testDataProvider();
// after
const dataProvider = testDataProvider({
  deleteMany: async () => ({ data: [1, 2, 3] }),
});
Defensive patterns

Strategy: try-catch

Validate before calling

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

Try / catch

try { await dataProvider.deleteMany(r, { ids }); } catch (e) { /* stub deleteMany */ throw e; }

Prevention

When it happens

Trigger: A test path that calls dataProvider.deleteMany (useDeleteMany, BulkDeleteButton, bulk selection delete) against testDataProvider() with no deleteMany override.

Common situations: Testing a datagrid's bulk delete toolbar; batch cleanup logic in unit tests; forgetting bulk methods while stubbing single delete only.

Related errors


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