@testing-library/react version: 14.3.1
- Testing Framework and version: vitest v1.6.0 & vitest-vscode v0.10.7
- DOM Environment: jsdom (23.2.0)
Relevant code or config:
Renderer Code
export const renderWithProviders = (
ui: ReactElement,
extendedRenderOptions: ExtendedRenderOptions = {},
) => {
const {
preloadedState = {},
// Automatically create a store instance if no store was passed in
store = makeStore(preloadedState),
...renderOptions
} = extendedRenderOptions
const Wrapper = ({ children }: PropsWithChildren) => (
<Provider store={store}>{children}</Provider>
)
const rendered = render(<div>{ui}</div>, {
...renderOptions,
wrapper: Wrapper,
})
// Return an object with the store and all of RTL's query functions
return {
...rendered,
store,
user: userEvent.setup(),
rerender: (ui: ReactElement) => {
store: makeStore(preloadedState),
renderWithProviders(ui, {
wrapper: Wrapper,
container: rendered.container,
...renderOptions,
})
},
}
}
Test Code
//Search Test
test("Search Bar should mount, have no initial value, and re-render properly", async () => {
const { store, user, rerender } = renderWithProviders(<App />)
//Find search-bar and ensrue that initial value is empty
expect(screen.getByRole("textbox")).toBeInTheDocument()
expect(screen.getByRole("textbox")).toHaveValue("")
//get the ui-component and emulate user typing
const inputUI = screen.getByRole("textbox")
await user.type(inputUI, "Bowjeet is King")
//screen debug info after typing
screen.debug()
console.log(store.getState())
// Rerender the component (issue: the store does not clear)
rerender(<App />)
// Screen debug after re-render
screen.debug()
// Ensure the value is reset (issue: the component clears but the store does not)
expect(screen.getByRole("textbox")).toHaveValue("")
console.log(store.getState())
})
What you did:
Called rerender after initial call to renderWithProviders to test resetting redux state. renderWithProviders is a custom wrapper to include redux store
What happened:
After calling rerender, the redux store still persists state from initial render call. The screenshot below shows that the screen rerenders appropriately, but the redux store does not reset.

Reproduction:
https://github.com/Agriculture-Intelligence/react-test-library-redux-example/tree/master
Related to:
#218 (comment)
#950
testing-library/testing-library-docs#1156 ?
Problem description:
rerender should reset the wrapper as well. Our understanding of rerender is that it should work similar to a browser refresh.
Ultimately, we want to test our components using Gherkin syntax and reset the component for every scenario as such
describeFeature(feature, (f) => {
let viRender = renderWithProviders(<InventoryTab />, {
preloadedState,
})
f.AfterEachScenario(() => {
viRender.rerender();
})
f.Scenario(...);
This Gherkin syntax testing is not included in the reproduction to simplify the issue we are having, this testing style comes from https://github.com/amiceli/vitest-cucumber
Suggested solution:
- Make the rerender API more powerful?
@testing-library/reactversion: 14.3.1Relevant code or config:
Renderer Code
Test Code
What you did:
Called
rerenderafter initial call torenderWithProvidersto test resetting redux state.renderWithProvidersis a custom wrapper to include redux storeWhat happened:
After calling
rerender, the redux store still persists state from initial render call. The screenshot below shows that the screen rerenders appropriately, but the redux store does not reset.Reproduction:
https://github.com/Agriculture-Intelligence/react-test-library-redux-example/tree/master
Related to:
#218 (comment)
#950
testing-library/testing-library-docs#1156 ?
Problem description:
rerendershould reset the wrapper as well. Our understanding of rerender is that it should work similar to a browser refresh.Ultimately, we want to test our components using Gherkin syntax and reset the component for every scenario as such
This Gherkin syntax testing is not included in the reproduction to simplify the issue we are having, this testing style comes from https://github.com/amiceli/vitest-cucumber
Suggested solution: