Kri*_*hna 14 unit-testing reactjs react-redux react-hooks
我有一个反应应用程序,它使用 react-redux,useSelector 从商店获取数据。反应组件有
function PersonDataView() {
const name= useSelector(state => state.data.name)
const dob= useSelector(state => state.data.dob)
const dispatch = useDispatch()
const show= () => dispatch({type: 'SHOW'})
const remove= () => dispatch({type: 'REMOVE'})
return (
<div>
<h2>Person Details</h2>
<div>
<button onClick={show}>Show</button>
<span aria-label="name">{name}</span>
<span aria-label="dob">{dob}</span>
<button onClick={remove}>Remove</button>
</div>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 react-testing-library 来测试这个组件。是否有任何 API 可以让我们更轻松地测试这些组件。我知道测试这些的两种方法:1)我可以使用 redux-mock-store 模拟商店,然后将此组件包装在提供程序组件下。2) 在 jest 中模拟 useSelector 方法
jest.mock('react-redux', () => ({
useSelector: () => ({
})
});
Run Code Online (Sandbox Code Playgroud)
但是使用 jest mock 的问题是在多个选择器的情况下,所有 useSelectors 将返回相同的模拟值。使用玩笑的方式, jest.fn().mockReturnValueOnce() 在我看来并不正确。
Emz*_*zaw 14
我建议采用不同的方法 - 将您的选择器提取到单独的文件中,例如文件 selectors.js:
const nameSelector = state => state.data.name;
const dobSelector = state => state.data.dob;
Run Code Online (Sandbox Code Playgroud)
然后在测试中,您可以模拟 useSelector 如下:
jest.mock('react-redux', () => ({
useSelector: jest.fn().mockImplementation(selector => selector()),
}));
Run Code Online (Sandbox Code Playgroud)
并分别模拟选择器,例如:
jest.mock('./selectors.js', () => ({
nameSelector: jest.fn().mockReturnValue("myTestName"),
dobSelector: jest.fn().mockReturnValue("myTestDob"),
}));
Run Code Online (Sandbox Code Playgroud)
小智 1
尝试这个:
jest.mock('react-router');
const useSelectorMock = useSelector as any;
describe('something', () {
test('name', () => {
// Use this for each useSelector call:
useSelectorMock.mockImplementationOnce(jest.fn(() => returnValue as yourType));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11363 次 |
| 最近记录: |