React 测试库:如何管理重复的测试代码

React testing library: How to manage the duplicated test code

最近我正在对一个由不同组件和服务组成的应用程序进行集成测试,因此我正在为与这些元素的不同用户行为交互创建测试。

我注意到我的测试重复了一些常见的初始语句。

例如:

所以我总是从下一句话开始:

beforeEach(() => render(MyComponent))

test('test A', () => {
  fireEvent.click(screen.getByRole('button', {name: /search/i/)))
  // ... rest of the particular test
})

test('test B', () => {
  fireEvent.click(screen.getByRole('button', {name: /search/i/)))
  // ... rest of the particular test
})

test('test C', () => {
  fireEvent.click(screen.getByRole('button', {name: /search/i/)))
  // ... rest of the particular test
})

// and so on...

所以我所做的是创建一个 fireSearchClick 全局函数作为:

const fireSearchClick = () => fireEvent.click(screen.getByRole('button', {name: /search/i/)))

test('test A', () => {
  fireSearchClick() // <<< now is called in this way
  // ... rest of the particular test
})

我认为这样做的好处是只有一个地方可以更新“fire search”触发器,例如,如果按钮标签更改为“提交”(就像更改示例一样)。

但是当我继续进行更多测试时,我以可重复的模式结束,例如:

test('test N', async () => {
  fireSearchClick()

  await loadingData() // another global function that i created for wait results

  fireNextPage() // another global function that i created for go through next page results
  
  await loadingData()

  // the particular things of this test...
})

test('test M', async () => {
  fireSearchClick()

  await loadingData() // another global function that i created for wait results

  fireNextPage() // another global function that i created for go through next page results
  
  await loadingData()

  // the particular things of this test...
})

// and so on...

我关心的是:

我正在考虑在 beforeEach 挂钩上实现所有初始可重复步骤,但它 可能 它可能包含很多难以跟踪的逻辑当某些步骤失败时(例如,如果我在 beforeEach 中执行 fireEvent 失败,很难找出错误在哪里)

你怎么看?你如何处理这种情况?

您可以将所有设置组合在一个函数中并在您的测试或 beforeEach 挂钩中调用它

const setupTest = async () => {
  render(<MyComponent />)
  fireSearchClick()
  await loadingData()
  fireNextPage()
  await loadingData()
}

test('test M', async () => {
  await setupTest()
  // the particular things of this test...
})

但是,如果这使得测试速度太慢而您想提高速度,您可以尝试渲染状态已经设置的特定组件——准备好测试。即

render(<MyComponent data={mockData} page={2} />)