【问题标题】:What does this part of the Redux document mean?Redux 文档的这一部分是什么意思?
【发布时间】:2021-05-23 23:47:30
【问题描述】:
我正在使用 Redux 工具包进行设置。我们现在使用@testing-library/react 来设置与测试相关的设置。
我在查看official document 时遇到了一个问题。
// test-utils.js
import React from 'react'
import { render as rtlRender } from '@testing-library/react'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
// Import your own reducer
import reducer from '../reducer'
function render(
ui,
{
initialState,
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'
// override render method
export { render }
这部分在上面的代码部分有什么功能?
// re-export everything
export * from '@testing-library/react'
// override render method
export { render }
【问题讨论】:
标签:
reactjs
redux
ecmascript-6
react-testing-library
testing-library
【解决方案1】:
他们基本上是在创建自己的 React 测试库包的别名副本,其中除了 render 函数外,其他所有内容都相同。此设置在测试库文档部分Setup: Custom Render 中有更详细的说明。
自定义 render 函数 takes the same arguments 与 @testing-library/react 中的原始 render 函数一样,因此它们可以互换使用(尽管它在 options 中添加了对额外属性 initialState 和 store 的支持目的)。在内部,自定义渲染函数调用库的渲染函数,它们使用别名 rtlRender 导入,但它为 wrapper option 设置了默认属性,以便组件将在 redux Provider 组件内呈现。
现在是令人困惑的出口。 export * from '@testing-library/react' 从测试库中获取所有导出并重新导出它们。 export { render } 用自定义的覆盖了之前导出的渲染函数,所以它需要在 export * 之后。
至于为什么他们会在一个地方创建函数然后export 它而不是仅仅做export function,我认为这只是代码风格偏好的问题。据我所知,这似乎工作正常:
import { render as rtlRender } from "@testing-library/react";
// re-export everything
export * from "@testing-library/react";
// override render method
export function render(somethingCustom, ui, { ...renderOptions } = {}) {
return rtlRender(ui, { ...renderOptions });
}
【解决方案2】:
我不知道这个库,但export * from '@testing-library/react' 只是意味着你可以从@testing-library/react 中import 的任何东西,你现在可以直接从这个文件中导入,test-utils.js。
我猜他们发现有一种方法可以方便地在一个地方只访问 react 测试模块,render 方法被上面定义的他们自己的自定义版本覆盖。