marmelab/react-admin · error · Error

updateMany not implemented

Error message

updateMany not implemented

What it means

The default testDataProvider's updateMany method throws deliberately. Bulk updates are not implemented in the default provider, so tests must override it.

Source

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

        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');
    },
};
export const testDataProvider = (
    overrides?: Partial<DataProvider>
): DataProvider => ({
    ...defaultTestDataProvider,
    ...overrides,
});

View on GitHub (pinned to 051f511bb0)

Solutions

  1. Override it: testDataProvider({ updateMany: async () => ({ data: [1, 2] }) })
  2. Provide a jest/vi spy for updateMany to assert calls
  3. Disable bulk actions in the test (Datagrid bulkActionButtons={false})

Example fix

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

Strategy: validation

Validate before calling

if (dataProvider.updateMany === defaultTestDataProvider.updateMany) {
  throw new Error('updateMany must be overridden when testing bulk actions');
}

Type guard

const canUpdateMany = (dp: DataProvider): boolean => typeof dp.updateMany === 'function' && dp.updateMany !== defaultTestDataProvider.updateMany;

Try / catch

try {
  await dataProvider.updateMany('posts', { ids: [1, 2], data: { published: true } });
} catch (e) {
  if (/updateMany not implemented/.test(e.message)) {
    console.warn('Override updateMany in testDataProvider');
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling dataProvider.updateMany (or useUpdateMany / bulk selection actions in a List) with the default testDataProvider and no updateMany override.

Common situations: Testing bulk-select delete/update actions in a ListView; the Datagrid bulk action buttons call updateMany against the unmocked default.

Related errors


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