火灾事件后反应测试库没有清理

Jos*_*vin 5 reactjs react-testing-library

我们一直在使用 React 钩子useReduceruseContext在我们的React应用程序中处理全局存储。

在使用 react 测试库运行测试时,我们注意到一旦我们的状态在一个测试中发生变化,接下来的所有测试现在都会发生该状态变化。

我们曾尝试进行清理,afterEach(cleanup)但没有奏效。

不知道发生了什么?

import React, { useContext, useReducer } from 'react'
import { render, fireEvent } from '@testing-library/react'
import '@testing-library/jest-dom/extend-expect'
import TodosList from './TodosList'
import reducer from '../../reducers/reducer'
import Store from '../../context'
import fixture from '../../tests/fixtures'

function Component() {
  const [state, dispatch] = useReducer(reducer, fixture)

  return (
    <Store.Provider value={{ state, dispatch }}>
      <TodosList />
    </Store.Provider>
  )
}

describe('todos', () => {
  it('removes a todo when button is pressed', () => {
    const { getByTestId, getAllByText } = render(<Component />)
    expect(getAllByText('Delete').length).toBe(3)
    window.confirm = jest.fn().mockImplementation(() => true)

    fireEvent.click(getByTestId('delete-1'))
    expect(window.confirm).toHaveBeenCalled()
    expect(getAllByText('Delete').length).toBe(2)
  })

  it('check that first test did not effect this test', () => {
    const { getByTestId, getAllByText } = render(<Component />)
    expect(getAllByText('Delete').length).toBe(3) //this fails and is 2
  })
})
Run Code Online (Sandbox Code Playgroud)

Gab*_*ile 2

我遇到了同样的问题,我得出的结论是 cleanup卸载通过渲染安装的 React 树,但不会从存储/减速器重置状态。

就我而言,由于我使用另一个库进行中央状态管理,因此我的解决方案是在我的商店中创建一个重置函数,并在每次测试开始时调用它。您可以使用我认为更接近用户使用应用程序的相同方法,也可以遵循下一种方法。

在使用 Redux 的官方建议中,他们建议重新创建您自己的渲染函数并向其提供您的存储 https://testing-library.com/docs/example-react-redux

function render(
  ui,
  {
    initialState = reducerInitialState,
    store = createStore(reducer, initialState),
    ...renderOptions
  } = {}
) {
  function Wrapper({ children }) {
    return <Provider store={store}>{children}</Provider>
  }
  return rtlRender(ui, { wrapper: Wrapper, ...renderOptions })
}

// re-export everything
export * from '@testing-library/react'
Run Code Online (Sandbox Code Playgroud)
// In your test
const store = createStore(() => ({ count: 1000 }))
render(<Counter />, {
  store,
});
Run Code Online (Sandbox Code Playgroud)