Reactjs 我应该使用beforeach()挂载并为每个测试设置道具,还是在每个测试开始时挂载特定组件?(使用酶、柴和摩卡)

Reactjs 我应该使用beforeach()挂载并为每个测试设置道具,还是在每个测试开始时挂载特定组件?(使用酶、柴和摩卡),reactjs,unit-testing,mocha.js,enzyme,chai,Reactjs,Unit Testing,Mocha.js,Enzyme,Chai,我最近开始编程。我在一个团队中,在React中编程,并使用酶、摩卡和柴进行单元测试。请参阅下面的软件包版本 当测试一个组件时,有几个用例需要不同的prop值,我应该在每个测试中使用beforeach()然后使用setProps(),还是应该在每个测试开始时执行显式mount()(或shallow())?这有关系吗 例如,我可以使用beforeach()在没有任何道具的情况下装载,然后在每个测试中使用setProps(),如下所示(使用伪代码): description('MyComponent'

我最近开始编程。我在一个团队中,在React中编程,并使用酶、摩卡和柴进行单元测试。请参阅下面的软件包版本

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

例如,我可以使用beforeach()在没有任何道具的情况下装载,然后在每个测试中使用setProps(),如下所示(使用伪代码):

description('MyComponent',()=>{
在每个(…让组件=mount()…)之前
它('测试用例1',()=>{
//设置道具A=123
setProps({A:123})
//断言一些东西
})
它('测试用例2,()=>{
//将道具A设置为456,B设置为“foo”
setProps({A:456})
setProps({B:'foo'})
//断言一些东西
})
})
或者我可以在每个测试开始时进行特定于用例的挂载,在挂载中传递道具,如下所示:

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
   })

})
description('MyComponent',()=>{
它('测试用例1',()=>{
…山()
//断言一些东西
})
它('测试用例2,()=>{
…山()
//断言一些东西
})
})
每种方法的优缺点是什么?是否有最佳实践

套餐

  • “酶”:“^3.3.0”
  • “酶-适配器-反应-16”:“^1.1.1”
  • “摩卡”:“^5.0.0”
  • “柴”:“3.5.0”

对于类组件,有
组件安装
构造函数
,而对于功能组件,有
使用效果(…,[])
。所有这些东西都只叫一次

另一方面,对于方法2,仍然需要在单独的测试用例中测试道具更新,以确保组件能够正确处理。否则,如果在不同的
中使用相同的组件,则无法获取导航数据(仅在
componentDidMount
中发生)

说如果你有

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

若你们可以直接从第一个导航到第二个,这意味着React Router不会重新创建
UserScreen
,只会更新已经呈现的实例。因此,使用方法#1,您将自动使用测试覆盖此情况。而方法#2需要您明确地测试
componentdiddupdate
行为


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

我认为您无法像第一个场景那样在安装后设置道具,因此如果每次测试道具都不同,那么第二个变体就是go@PatrickHund在beforeach中,mount()结果被分配给一个变量。例如,让组件=安装(…)。然后在每个测试用例中,您都可以执行component.setProps({A:123})。这似乎有效(即,断言通过),但我们是否误解了什么?你是对的,我不知道你可以用酶来做这件事。我学到了一些东西,thx:-)@MarnieA。当您执行
setProps
时,它将执行组件的更新生命周期,这与最初传递props不同。因此,当您想要测试具有某种依赖性的组件didmount/useffect时,您将无法使用setProps。我个人更喜欢第二种方法和工厂方法,因为它更干净,其他读者需要了解的一切都在一个地方。下面是Kent.C.Dodds关于这种模式的一篇很好的文章。下面是这种模式的一个示例。谢谢,@skyboyer。我的测试是针对类组件的。我有点不明白你第二段的意思。你能帮我解释一下,希望它能让我明白吗?我对这一切都很陌生。谢谢添加示例并放大说明。
<Route path="/Album/:id/author" component={UserScreen} />
<Route path="/user/:id/" component={UserScreen} />