Day 27:我们又回来了redux

来最後几天我们又跳回去React-Testing-Library XDDD
相信还是有很多公司使用redux来当作global store来使用,因此最後几天我们来聊聊redux如何使用RTL来做单元测试.

那接下来写一个非常简单的reducer

const SET_NAME = 'SET_NAME';

const initialState = {
	name: ''
};

const reducer = (state = initialState, action) => {
	switch (action.type) {
		case SET_NAME:
			return {
				name: 'stan'
		}
		
		default:
			return state;
	}
}

再来一个非常简单的component

import { useSelector, useDispatch } from 'react-redux';

const Avatar = () => {
  const name = useSelector(strate => state.name);
  const dispatch = useDispatch();
  
  const handleChangeName = () => dispatch({type: 'SET_NAME' })

  return (
    <>
      <div data-testid="name">
				{name}
			</div>
      <button onClick={handleChangeName}>submit</button>
    </>
  )
}

再来就是一个简单的test case

import { render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Provider } from 'react-redux';
import store from './store';
import Avatar from '....';

test('render component with redux', () => {
  const { getByTestId, getByText } = render(
    <Provider store={store}>
      <Avatar />
    </Provider>
  );
  const elem = getByText(/submit/i)
  userEvent.click(elem);
  expect(getByTestId('name')).toHaveTextContent('stan')
})

这样就可以做一个简单的redux整体流程的测试,谢谢大家


<<:  [ Day 27 ] - 样板字面值(Template literals)

>>:  成为工具人应有的工具包-27 ShellMenuView

【Day4】[资料结构]-链结串列Linked List-实作

链结串列(Linked List)建立的方法 append: 在尾部新增节点 insertAt: 在...

[day 18] 自动布局

介绍 简单来说使用自动布局可能就是为了适配不同 iPhone 机型所发展的一个方法或框架? 总之我觉...

[Android Studio 30天自我挑战] 新增Spinner的两种方式

可以透过String.xml来新增Spinner内的清单列表 另外一种可以透过MainActivit...

Day9 HTML 常用标签: table

表格 (table) 表格是一个由列和栏组成的结构化资料(tabular data)。表格能帮助你快...

2.4.1 Design System - Avatar元件

年龄这件无关紧要的小事 从小我就很讨厌任何因为年纪而设下的规范 尊重长辈绝对是因为他做人处事很值得...