July 15, 2019
참조
위 2가지 테스팅 튜토리얼 문서를 레퍼런스로 참조하고 React Hooks로
코드를 작성하며, 카운팅 유닛테스트 포스팅을 작성하게 됐다.
특히 튜토리얼 문서는 번역된지 1년이 지났지만 이제야 본걸 후회할 정도로
정말 디테일하게 설명되어있다.
꼭 선행후에 진행 하기 바랍니다.
테스트 같은 경우 크게 4가지로 나뉜다.
계층 구조로 점차 범위가 좁아진다.
위 포스팅을 선행했다면, 기본적인 리액트,mocha,chai,enzyme 설치와 웹팩 설정 스크립트 설정등을 진행했다고 가정하고 이후에 App에 대한 코드베이스 레벨부분에 대해 진행하려고 한다.
import React, {useState} from 'react';
export const App = () => {
const [ state, setState ] = useState({counter:0});
return (
<div>
<h1>{state.counter}</h1>
</div>
);
};
export default App;
import React, {useState} from 'react';
export const onIncrement = ({...state}) => {
state.counter = state.counter + 1;
return state;
};
export const onDecrement = ({...state}) => {
state.counter = state.counter - 1;
return state;
};
export const App = () => {
const [ state, setState ] = useState({counter:0});
const doIncrement = () => {
setState(onIncrement);
};
const doDecrement = () => {
setState(onDecrement);
};
return (
<div>
<h1>{state.counter}</h1>
<button onClick={doIncrement}>플러스 +</button>
<button onClick={doDecrement}>마이너스 -</button>
</div>
);
};
export default App;
import React, {useState} from 'react';
// ...
export const Counter = ({ counter }) => {
return <p>{counter}</p>
};
export const App = () => {
const [ state, setState ] = useState({counter:0});
// ...
return (
<div>
<Counter counter={state.counter}/>
// ...
</div>
);
};
export default App;
모든 함수 작성을 끝내고, 단위 테스트를 진행하기 위한 테스트코드를 작성해보겠다.
import {onIncrement, onDecrement} from './App';
describe('Counter State', () => {
it('should increment the counter in state', () => {
const state = { counter: 0 }; //정의
const newState = onIncrement(state); //실행
expect(newState.counter).to.equal(1); //단언
});
it('should decrement the counter in state', () => {
const state = { counter: 0 };
const newState = onDecrement(state);
expect(newState.counter).to.equal(-1);
});
});
describe('App Component', () => {
it('Counter 래퍼를 그려낸다', () => {
const wrapper = shallow(<App />);
expect(wrapper.find(Counter)).to.have.length(1);
});
it('Counter 래퍼에 모든 Prop이 전달되었다', () => {
const wrapper = shallow(<App />);
let counterWrapper = wrapper.find(Counter);
expect(counterWrapper.props().counter).to.equal(0);
});
it('counter를 증가 시킨다', () => {
const wrapper = shallow(<App />);
wrapper.find('button').at(0).simulate('click');
let counterWrapper = wrapper.find(Counter);
expect(counterWrapper.props().counter).to.equal(1);
});
it('counter를 감소 시킨다', () => {
const wrapper = shallow(<App />);
wrapper.find('button').at(1).simulate('click');
let counterWrapper = wrapper.find(Counter);
expect(counterWrapper.props().counter).to.equal(-1);
});
});
위와 같이 2개의 테스트 묶음, 총 6개의 테스트 케이스를 작성하고 Mocha로 테스트를 실행할 경우 모든 케이스가 통과하는걸 확인 할 수 있다. 테스팅 튜토리얼을 한번 따라해보았으면 클래스 컴포넌트만 함수형 컴포넌트로 변경후에 약간의 테스트 케이스만 수정해주면 쉽게 따라할 수 있다.