TroubleShooting/Next.js
[Next.js] svgr/webpack과 vitest를 사용한 SVG 테스트 ( vitest 에서 svg 경로를 못 읽는 이슈 )
머지?는 병합입니다
2025. 1. 7. 14:20
왜 이러는 지 한참을 삽질하다
이렇게 직접 tsx안에 적어주니
통과를 합니다...????
이 때 깨달았습니다.
@svgr/webpack 사용하면 vitest 에서 svg 경로 오류가 생기는구나 하고....
아예 랜더링에서 막히고 있습니다...
랜더링을 못하니 아예 해당 Hear 컴포넌트 전체를 테스트 할 수가 없어졌는데요
모킹으로 넘겨서 테스트 랜터링을 넘겨야겠다고 판단했습니다.
1. vite-plugin-svgr 설치
npm install vite-plugin-svgr --save-dev
2. vitest.config.ts 에 vite-plugin-svg 추가
// vitest.config.ts
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
import tsconfigPaths from 'vite-tsconfig-paths'
import svgr from 'vite-plugin-svgr'; // 여기 추가
export default defineConfig({
plugins: [tsconfigPaths(), react(), svgr()],// 여기 svgr() 추가
3. 다시 svgr로 컴포넌트 화 시킨 SVG 컴포넌트를 사용
4. mock svg 작성
// svgMock.tsx
const SvgMock = (props: React.SVGProps<SVGSVGElement>) => (
<svg {...props}>
<text x="0" y="15" fill="black">Mocked SVG</text>
</svg>
);
export default SvgMock;
5. 테스트 코드에 SVG mock 적용
import { render, screen } from '@testing-library/react';
import Header from '../Header';
import { vi } from 'vitest';
import SvgMock from '../../__mocks__/svgMock'; // 절대 경로 사용
// SVG 모킹 적용
// 첫 인자에는 실제 svg가 있는 경로( 저는 public 폴더 )
vi.mock('/aboutMe.svg',
() => ({ default: () => <SvgMock /> }));
describe('Header', () => {
it('renders the correct link text', () => {
render(<Header />);
// screen.debug();
const aboutMeLink = screen.getByText('About Me');
expect(aboutMeLink).toBeInTheDocument();
});
});
jsdom이 랜더링 되면서 테스트 통과 😂