📖 Scenario: You are building a Vue 3 application that uses composables and Pinia stores to manage state and logic. To ensure your components work correctly, you want to write tests that mock these composables and stores.This project will guide you step-by-step to create a mock composable and a mock Pinia store, then use them in a test setup.
🎯 Goal: Build a Vue test setup that mocks a composable called useUser and a Pinia store called useCartStore. You will create the mock data, configure mock implementations, apply the mocks in a test, and finalize the test setup.
📋 What You'll Learn
Create a mock user object with specific properties
Create a mock cart store with an items property and an action
Mock the useUser composable to return the mock user
Mock the useCartStore Pinia store to use the mock store
Use the mocks in a test setup for a Vue component
💡 Why This Matters
🌍 Real World
In real Vue projects, mocking composables and stores allows developers to write focused tests that do not depend on actual backend data or complex state logic. This makes tests faster and more reliable.
💼 Career
Understanding how to mock composables and stores is important for frontend developers working with Vue and Pinia, especially when writing unit and integration tests for components.
Progress0 / 4 steps
1
Create mock user data
Create a constant called mockUser with an object containing these exact properties: id set to 1, name set to 'Alice', and isLoggedIn set to true.
Vue
Hint
Use const mockUser = { id: 1, name: 'Alice', isLoggedIn: true } to create the mock user object.
2
Create mock cart store
Create a constant called mockCartStore with an object that has items set to an empty array, and an addItem method that is a jest mock function.
Vue
Hint
Use jest.fn() to create a mock function for addItem.
3
Mock composable and store imports
Use jest.mock to mock the useUser composable module to return mockUser, and mock the useCartStore Pinia store module to return mockCartStore.
Vue
Hint
Use jest.mock('module', () => ({ functionName: () => mockData })) pattern to mock modules.
4
Use mocks in test setup
Import mount from @vue/test-utils and a component called MyComponent. Then create a test block named 'renders with mocked composable and store' that mounts MyComponent and asserts the component exists.
Vue
Hint
Use mount to render the component and expect(wrapper.exists()).toBe(true) to check it rendered.
Practice
(1/5)
1. What is the main reason to mock composables or stores in Vue component tests?
easy
A. To automatically generate UI snapshots
B. To improve the component's runtime performance
C. To isolate the component test from real logic and external dependencies
D. To enable two-way data binding in tests
Solution
Step 1: Understand the purpose of mocking
Mocking replaces real implementations with fake ones to isolate tests from external logic.
Step 2: Apply this to composables and stores
Mocking composables and stores prevents side effects and focuses tests on the component itself.
Final Answer:
To isolate the component test from real logic and external dependencies -> Option C
Quick Check:
Mocking isolates tests = A [OK]
Hint: Mock to isolate component logic from external code [OK]
Common Mistakes:
Thinking mocking improves runtime performance
Confusing mocking with UI snapshot generation
Believing mocking enables data binding
2. Which syntax correctly mocks a composable module named useAuth using Vitest's vi.mock()?
A. The mock should return a function, not an object directly
B. The vi.fn() should be replaced with a real function
C. The module path './useCounter' is incorrect
D. The mock should not include the increment function
Solution
Step 1: Understand composable mocking pattern
Composable modules export functions, so mocks must return a function, not an object.
Step 2: Identify the incorrect mock structure
The code returns an object directly instead of a function returning the object.
Final Answer:
The mock should return a function, not an object directly -> Option A
Quick Check:
Composable mocks return functions = D [OK]
Hint: Mock composables as functions returning objects [OK]
Common Mistakes:
Returning object directly instead of function
Replacing vi.fn() unnecessarily
Incorrect module path assumptions
5. You want to test a Vue component that uses a Pinia store with a fetchData action. How do you mock the store to verify fetchData is called without running its real logic?
hard
A. Replace fetchData with an empty async function in the real store
B. Import the real store and spy on fetchData without mocking
C. Mock the component instead of the store
D. Use vi.mock() to replace the store module with a mock where fetchData is a vi.fn()
Solution
Step 1: Understand mocking for store actions
To isolate tests, replace the store module with a mock that has fetchData as a mock function.
Step 2: Use vi.mock() to replace the store module
This allows you to track calls to fetchData without executing its real code.
Final Answer:
Use vi.mock() to replace the store module with a mock where fetchData is a vi.fn() -> Option D
Quick Check:
Mock store action with vi.fn() = A [OK]
Hint: Mock store actions with vi.fn() to track calls without side effects [OK]
Common Mistakes:
Not mocking the store and calling real logic
Mocking the component instead of the store
Replacing functions with empty but untracked implementations
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.