marmelab/react-admin · error · Error

update not implemented

Error message

update not implemented

What it means

The default testDataProvider's update method intentionally throws because no default update behavior is provided. Tests must supply their own update implementation via overrides.

Source

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

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

View on GitHub (pinned to 051f511bb0)

Solutions

  1. Pass an update override: testDataProvider({ update: async (resource, params) => ({ data: { ...params.data, id: params.id } }) })
  2. Use testDataProvider's onError/success helpers or a spy (vi.fn/jest.fn) for update
  3. Skip the mutation in the test if update behavior is out of scope

Example fix

// before
const dataProvider = testDataProvider();
// after
const dataProvider = testDataProvider({
  update: async (_resource, params) => ({ data: params.data as any }),
});
Defensive patterns

Strategy: validation

Validate before calling

if (typeof dataProvider.update !== 'function' || testDataProvider().update === dataProvider.update) {
  throw new Error('update must be mocked before testing edit flows');
}

Type guard

const canUpdate = (dp: DataProvider): boolean => dp.update !== defaultTestDataProvider.update;

Try / catch

try {
  await dataProvider.update('posts', { id: 1, data: { title: 'x' }, previousData: {} });
} catch (e) {
  if (/update not implemented/.test(e.message)) {
    console.warn('Provide testDataProvider({ update: ... }) in this test');
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling dataProvider.update (directly or via useUpdate/Edit views) on the default testDataProvider without an update override.

Common situations: Testing record editing flows (useUpdate, Edit page save) with the default testDataProvider and forgetting to mock update.

Related errors


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