wrapper.instance().state与wrapper.state()的区别、适用场景及性能对比咨询
关于
wrapper.instance().state vs wrapper.state()的使用场景 好问题!咱们来拆解一下这两个Enzyme方法的适用场景、区别,以及你关心的性能问题:
优先用wrapper.state()的场景
这是Enzyme为类组件测试专门提供的快捷、高效的state读取方式,也是官方推荐的常规用法:
- 当你只需要读取组件的state(不管是单个属性还是整个state对象)时,直接用它就够了。比如:
// 读取单个state属性 const username = wrapper.state('username'); // 读取整个state对象 const fullState = wrapper.state(); - 性能上它确实更优,因为它不需要返回整个组件实例,只是直接提取并返回state部分,避免了不必要的对象引用和属性遍历。
必须用wrapper.instance().state的场景
wrapper.instance()会返回类组件的完整实例对象——除了state,还包含组件的自定义方法、props、refs、实例变量等所有内容。你需要用它的场景通常是:
- 你需要调用组件实例上的自定义方法,比如测试某个内部逻辑方法执行后的状态变化:
wrapper.instance().handleFormSubmit(mockData); expect(wrapper.state('submitted')).toBe(true); - 你需要访问state之外的实例属性,比如组件的refs(比如旧项目里的字符串refs)、或者自定义的实例变量(比如
this.cacheData这类); - 某些特殊场景下,你需要直接操作实例的属性(虽然这种情况尽量避免,优先通过props或模拟事件触发更符合测试最佳实践)。
关于你的疑问
是否只有在需要检查所有内容时才使用它?
其实不是,更多是当你需要操作实例方法或访问state之外的属性时才用它,而不是单纯“检查所有内容”。比如你根本不需要看所有属性,只是想调用一个内部方法,这时候就必须用wrapper.instance()。
在其他所有场景下wrapper.state()的性能都更优吗?
是的,在只需要读取state的场景下,wrapper.state()的性能确实更好——它是专门为读取state设计的API,比先获取整个实例再取state要高效,也更简洁易读。
另外补充个小知识点:这两个方法都只适用于类组件,函数组件没有实例,所以测试函数组件时,你需要用React Testing Library这类更适配的工具,或者Enzyme的其他API来测试状态变化~
内容的提问来源于stack exchange,提问作者mucle6
相关产品推荐
相关产品推荐

