diff --git a/docs/API.md b/docs/API.md index 01c7b7de5..588e857b4 100644 --- a/docs/API.md +++ b/docs/API.md @@ -384,4 +384,4 @@ expect(submitButtons).toHaveLength(3); // expect 3 elements ## `act` -Useful function to help testing components that use hooks API. By default any `render` and `fireEvent` calls are wrapped by this function, so there is no need to wrap it manually. This method is re-exported from [`react-test-renderer`](https://github.com/facebook/react/blob/master/packages/react-test-renderer/src/ReactTestRenderer.js#L567]). +Useful function to help testing components that use hooks API. By default any `render`, `update`, and `fireEvent` calls are wrapped by this function, so there is no need to wrap it manually. This method is re-exported from [`react-test-renderer`](https://github.com/facebook/react/blob/master/packages/react-test-renderer/src/ReactTestRenderer.js#L567]). diff --git a/src/__tests__/act.test.js b/src/__tests__/act.test.js index db29ea4f3..67f22ab74 100644 --- a/src/__tests__/act.test.js +++ b/src/__tests__/act.test.js @@ -28,6 +28,14 @@ test('render should trigger useEffect', () => { expect(effectCallback).toHaveBeenCalledTimes(1); }); +test('update should trigger useEffect', () => { + const effectCallback = jest.fn(); + const { update } = render(); + update(); + + expect(effectCallback).toHaveBeenCalledTimes(2); +}); + test('fireEvent should trigger useState', () => { const { getByTestId } = render(); const counter = getByTestId('counter'); diff --git a/src/render.js b/src/render.js index 147175427..b68690fca 100644 --- a/src/render.js +++ b/src/render.js @@ -26,7 +26,7 @@ export default function render( return { ...getByAPI(instance), ...queryByAPI(instance), - update: renderer.update, + update: updateWithAct(renderer), unmount: renderer.unmount, toJSON: renderer.toJSON, debug: debug(instance, renderer), @@ -46,6 +46,14 @@ function renderWithAct( return ((renderer: any): ReactTestRenderer); } +function updateWithAct(renderer: ReactTestRenderer) { + return function(component: React.Element) { + act(() => { + renderer.update(component); + }); + }; +} + function debug(instance: ReactTestInstance, renderer) { function debugImpl(message?: string) { return debugDeep(renderer.toJSON(), message);