컴포저블, 스토어와 API 모킹
vi.mock(), useFetch 모킹, Pinia 스토어 모킹과 테스트에서 라우터를 모킹하는 방법을 다룹니다.
컴포저블, 스토어와 API 모킹은(는) CoddyKit의 무료 Vue Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Vue Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
왜 모킹할까요?
단위 테스트는 테스트 대상 컴포넌트를 격리해야 합니다. 실제 네트워크 호출, 실제 store, 무거운 컴포저블을 사용하면 테스트가 느리고 불안정해집니다. 모킹은 이러한 의존성을 제어 가능한 가짜 객체로 대체합니다.
vi.fn: 모킹 함수
vi.fn()은 호출 기록이 남는 함수를 만듭니다. 어떻게 호출되었는지 확인하고 반환값을 제어할 수 있습니다. 모든 모킹의 기본 구성 요소입니다.
import { vi } from "vitest"
const onSave = vi.fn()
onSave("draft")
expect(onSave).toHaveBeenCalledWith("draft")
expect(onSave).toHaveBeenCalledTimes(1)반환값 설정하기
비동기 코드에서는 mockReturnValue(동기) 또는 mockResolvedValue(해결된 프라미스)를 사용하여 모킹된 출력값을 제어합니다.
const getId = vi.fn().mockReturnValue(42)
expect(getId()).toBe(42)
const fetchUser = vi.fn().mockResolvedValue({ name: "Ada" })
// await fetchUser() => { name: "Ada" }컴포저블 모듈 모킹하기
vi.mock(path)는 모듈 전체를 대체합니다. 가짜 내보내기를 반환하는 팩토리를 제공합니다. 컴포넌트가 예측 가능한 데이터를 받도록 컴포저블을 대체할 때 사용합니다.
import { vi } from "vitest"
vi.mock("@/composables/useUser", () => ({
useUser: () => ({
user: { value: { name: "Ada" } },
isLoading: { value: false },
}),
}))vi.mock 호이스팅
vi.mock 호출은 가져오기가 실행되기 전에 파일 맨 위로 호이스팅됩니다. 따라서 팩토리에서 나중에 정의된 외부 변수를 참조할 수 없습니다. 필요한 도우미를 팩토리 내부나 vi.hoisted를 통해 선언하십시오.
// This runs before imports regardless of position.
vi.mock("@/api", () => ({ getPosts: vi.fn() }))
import { getPosts } from "@/api" // already the mockPinia store 테스트하기
Pinia store를 사용하는 컴포넌트에는 테스트에서도 store가 필요합니다. @pinia/testing은 기본적으로 액션이 모킹된 store를 제공하는 createTestingPinia를 제공합니다.
// terminal: npm install -D @pinia/testing
import { createTestingPinia } from "@pinia/testing"테스트용 Pinia 설치하기
마운트할 때 전역 plugins 옵션을 통해 테스트용 Pinia를 전달합니다. 초기 상태도 준비할 수 있습니다.
import { mount } from "@vue/test-utils"
import { createTestingPinia } from "@pinia/testing"
const wrapper = mount(Profile, {
global: {
plugins: [createTestingPinia({
initialState: { user: { name: "Ada" } },
})],
},
})store 액션 단언하기
기본적으로 액션은 스텁 처리되어 실행되지 않으므로 액션이 디스패치되었는지 단언할 수 있습니다. store를 가져와 spy를 확인하십시오.
import { useUserStore } from "@/stores/user"
const store = useUserStore()
await wrapper.get("button.logout").trigger("click")
expect(store.logout).toHaveBeenCalled()가져오기 함수 감시하기
모듈 전체를 대체하는 대신 전역 객체를 감시할 수 있습니다. vi.spyOn(global, "fetch")는 실제 가져오기 함수를 감싸므로 이를 재정의하고 확인할 수 있습니다.
const spy = vi.spyOn(global, "fetch").mockResolvedValue({
ok: true,
json: async () => ({ items: [1, 2, 3] }),
})전체 가져오기 함수 테스트
가져오기 함수를 모킹하고, 액션을 트리거하고, 프라미스를 모두 처리한 다음, 렌더링된 데이터와 가져오기 함수가 올바른 URL로 호출되었는지 단언합니다.
it("loads items", async () => {
vi.spyOn(global, "fetch").mockResolvedValue({
ok: true,
json: async () => ({ items: ["a", "b"] }),
})
const wrapper = mount(List)
await flushPromises()
expect(global.fetch).toHaveBeenCalledWith("/api/items")
expect(wrapper.findAll("li")).toHaveLength(2)
})테스트 사이에 모킹 초기화하기
공유 모킹에는 호출 기록이 누적됩니다. 한 테스트의 내용이 다른 테스트로 새어 나가지 않도록 beforeEach에서 초기화하거나 설정에서 clearMocks를 활성화하십시오.
import { beforeEach, vi } from "vitest"
beforeEach(() => {
vi.clearAllMocks()
})빠른 확인
모킹에 대한 이해도를 확인하십시오.
복습
테스트에서 의존성을 모킹하는 방법을 배웠습니다.
vi.fn()은 호출 기록이 남는 함수를 만듭니다.mockReturnValue/mockResolvedValue로 출력값을 제어합니다.vi.mock(path, factory)는 모듈을 대체합니다(예: 컴포저블). 가져오기보다 먼저 호이스팅됩니다.@pinia/testing의createTestingPinia는 스텁 처리된 액션이 있는 store를 제공하며, 액션 실행 여부를 단언할 수 있습니다.vi.spyOn(global, "fetch").mockResolvedValue(...)는 네트워크 호출을 가짜로 처리합니다.- 테스트 사이에
vi.clearAllMocks()로 모킹을 초기화합니다.
자주 묻는 질문
“컴포저블, 스토어와 API 모킹” 강의는 무료인가요?
네 — “컴포저블, 스토어와 API 모킹” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Vue Academy 강의 전체를 잠금 해제할 수 있습니다. Vue Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“컴포저블, 스토어와 API 모킹”에서 뭘 배우나요?
vi.mock(), useFetch 모킹, Pinia 스토어 모킹과 테스트에서 라우터를 모킹하는 방법을 다룹니다. 브라우저에서 직접 실행하는 실습 코드로 Vue Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Vue Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Vue Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“컴포저블, 스토어와 API 모킹” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Vue Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Vue Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Vue 프로젝트의 Vitest 설정
- 컴포넌트 마운트와 검색
- 사용자 상호작용과 이벤트 테스트
- 컴포저블, 스토어와 API 모킹