我应该使用 beforeEach() 安装并为每个测试设置props还是在每个测试开始时安装特定组件?(使用酶、柴和摩卡)

IT技术 reactjs unit-testing mocha.js enzyme chai
2021-05-14 03:42:33

我最近开始编程。我所在的团队在 React 中编程并使用 Enzyme、Mocha 和 Chai 进行单元测试。请参阅下面的软件包版本。

在测试有多个用例需要不同 prop 值的组件时,我应该在每个测试中使用 beforeEach() 然后 setProps() 还是应该在开始时执行显式的 mount()(或shallow())每次测试?有关系吗?

例如,我可以使用 beforeEach() 在没有任何props的情况下进行挂载,然后在每个测试中使用 setProps() 像这样(使用伪代码):

describe('MyComponent', () => {

   beforeEach(... let component = mount(<MyComponent />) ...)

   it('tests use case 1', () => {
      // set prop A = 123
      component.setProps({A: 123})
      // assert some stuff
   })

   it('tests use case 2, () => {
      // set prop A = 456 and B = 'foo'
      component.setProps({A: 456})
      component.setProps({B: 'foo'})
      // assert some stuff
   })

})

或者我可以在每次测试开始时执行特定于用例的挂载,在挂载中传递props,如下所示:

describe('MyComponent', () => {

   it('tests use case 1', () => {
      ...mount(<MyComponent A=123 />)
      // assert some stuff
   })

   it('tests use case 2, () => {
      ...mount(<MyComponent A=456 B='foo' />)
      // assert some stuff
   })

})

每种方法的优缺点是什么?有最佳实践吗?

套餐

  • "酶": "^3.3.0",
  • “酶适配器react 16”:“^1.1.1”,
  • "摩卡": "^5.0.0",
  • “柴”:“3.5.0”
1个回答

对于类组件有componentDidMountconstructor而对于功能组件有useEffect(..., [])所有这些东西都只调用一次。

另一方面,对于方法#2,仍然需要在单独的测试用例中测试 props 更新以确保组件正确处理。否则你可能会错过在不同的情况下使用相同的组件<Route>不会获取导航数据的情况(componentDidMount发生在

说如果你有

<Route path="/Album/:id/author" component={UserScreen} />
<Route path="/user/:id/" component={UserScreen} />

如果您可以直接从第一个导航到第二个,则意味着 React-Router 不会重新创建,UserScreen而只会更新已呈现的实例。因此,使用方法 #1,您将自动通过测试覆盖这种情况。虽然方法#2 需要您componentDidUpdate明确测试行为。

我不确定什么更好,但想强调测试流程和实际项目流程之间可能会发生差异。