// 기본적으로 component를 lazy하게 가져오기 위해서는 아래와 같이 // Suspense의 fallback속성으로 Loading component를 넣어서 // Switch를 감싸줘야 한다. <Suspensefallback={<Loading />}> <Switch> <Routeexactpath="/"component={Home} /> <Routepath="/menu1"component={Menu1} /> <Routepath="/menu2"component={Menu2} /> <Routepath="/notfound"component={Notfound} /> <Redirectto="/notfound" /> </Switch> </Suspense>;
history - createMemoryHistory
createMemoryHistory() 객체를 만들어서 전이될 화면에 대한 정보를 push()를 이용해서 넣어 줄 수 있다. 준비된 history 객체는 Router의 history property로 넣어주면 자동으로 Route에서 해당 경로(path)에 맞는 component를 rendering을 해주게 되고, 결과적으로 화면에 표시된 정보를 확인할 수 있다.
fireEvent는 화면상에서 Click과 같은 Event를 발생시킬때 사용된다. 이벤트를 발생시키고자 하는 Component에 data-testid 속성으로 id를 지정한 다음에 test하는 component를 render시킴으로써 getByTestId로부터 해당 id에 접근을 해서 fireEvent를 통해 event를 발생시킬 수 있다.
wait()
wait()함수는 Promise를 객체를 반환하고 기본적으로 50ms마다 wait()에 넘겨준 callback을 실행하고 timeout은 4500ms이다. wait()에 argument로 별도로 넘겨주는 callback 함수가 없다면, 빈 함수를 실행한다. 서버와 api 통신하는 경우에는 timeout이 발생할 수 있으므로, 이 경우에는 별도로 callback함수를 넣어서 처리해준다. testing-library의 version이 10이상인 경우에는 waitFor()함수를 사용하고, 이전 버전을 사용하는 경우에는 wait()함수를 사용하도록 하자.
// Test case 2 test('MENU1 menu를 클릭시, MENU1 component가 화면에 rendering되는가?', async() => { const { getByTestId } = render(<App />);
fireEvent.click(getByTestId('MENU1'));
awaitwait(); // menu1-wrapper id를 가진 component가 화면에 rendering되어있는지 확인 expect(getByTestId('menu1-wrapper')).toBeInTheDocument(); });
// Test case 2 test('MENU2 menu를 클릭시, MENU2 component가 화면에 rendering되는가?', async() => { const { getByTestId } = render(<App />);
fireEvent.click(getByTestId('MENU2'));
awaitwait(); // menu2-wrapper id를 가진 component가 화면에 rendering되어있는지 확인 expect(getByTestId('menu2-wrapper')).toBeInTheDocument(); });
// Test case 3 test('Route에 해당되는 path가 없는 경우, /notfound component로 rendering되는가?', async() => { const history = createMemoryHistory(); history.push('/not/found');
// Test case 3 test('IT menu를 클릭시, IT component가 화면에 rendering되는가?', async () => { const { getByTestId, getByText } = render(<App />);
fireEvent.click(getByTestId('it'));
awaitwaitFor(() => { // 화면에 it component의 wrapper class가 있는지 확인 expect(getByTestId('it-wrapper')).toBeInTheDocument(); }); });
// Test case 3-1 test('Development menu 클릭시, Development component가 화면에 rendering되는가?', async () => { const { getByTestId } = render(<App />);
fireEvent.click(getByTestId('development'));
awaitwaitFor(() => { //화면에 development component의 wrapper class가 있는지 확인 expect(getByTestId('development-wrapper')).toBeInTheDocument(); }); });
// Test case 3-2 test('Search menu 클릭시, Search component가 화면에 rendering되는가?', async () => { const { getByTestId } = render(<App />);
fireEvent.click(getByTestId('search'));
awaitwaitFor(() => { //화면에 search component의 wrapper class가 있는지 확인 expect(getByTestId('search-wrapper')).toBeInTheDocument(); }); });
// Test case 4 test('Route에 해당되는 path가 없는 경우, NotFound component로 rendering이 되는가?', async () => { const history = createMemoryHistory(); history.push('/not/found');