Skip to content

rerender does not reset state  #1331

@saiNaruUFL

Description

@saiNaruUFL
  • @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.

slkjsd

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions