Bird
Raised Fist0
Vueframework~8 mins

Mocking composables and stores in Vue - Performance & Optimization

Choose your learning style10 modes available
Performance: Mocking composables and stores
MEDIUM IMPACT
This affects page load speed and interaction responsiveness by controlling how much code and state logic runs during testing or development.
Testing or developing Vue components that use composables or stores
Vue
import { vi } from 'vitest';
import { useUserStore } from '@/stores/user';

vi.mock('@/stores/user', () => ({
  useUserStore: () => ({
    user: { name: 'Test' },
    fetchUser: vi.fn()
  })
}));

export default {
  setup() {
    const userStore = useUserStore();
    return { userStore };
  }
};
Mocking the store returns a lightweight fake object, avoiding full logic and state updates, speeding up rendering and tests.
📈 Performance Gainsaves multiple reflows, reduces test runtime by avoiding heavy store initialization
Testing or developing Vue components that use composables or stores
Vue
import { useUserStore } from '@/stores/user';

export default {
  setup() {
    const userStore = useUserStore();
    return { userStore };
  }
};
Directly importing and using the real store or composable runs full logic and state updates, causing slower tests and more DOM updates.
📉 Performance Costtriggers multiple reflows and repaints during tests, blocks rendering for longer due to full store initialization
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Using real composables/stores in testsHigh (full reactive tree)Multiple reflows per state changeHigh paint cost due to frequent updates[X] Bad
Mocking composables/stores with lightweight fakesLow (minimal reactive nodes)Single or no reflowsLow paint cost with fewer updates[OK] Good
Rendering Pipeline
When composables or stores are mocked, the browser skips heavy state setup and reactive updates, reducing work in style calculation, layout, and paint.
→JavaScript Execution
→Style Calculation
→Layout
→Paint
⚠️ BottleneckJavaScript Execution and Layout due to reactive state updates
Core Web Vital Affected
INP
This affects page load speed and interaction responsiveness by controlling how much code and state logic runs during testing or development.
Optimization Tips
1Always mock composables and stores in tests to reduce reactive state complexity.
2Avoid running full store logic during development previews to improve responsiveness.
3Use lightweight fake implementations to minimize layout and paint costs.
Performance Quiz - 3 Questions
Test your performance knowledge
Why does mocking Vue composables or stores improve test performance?
ABecause it increases the number of DOM nodes
BBecause it avoids running full reactive state logic and side effects
CBecause it forces more layout recalculations
DBecause it adds more network requests
DevTools: Performance
How to check: Record a performance profile while running tests or interacting with components using real vs mocked stores. Compare scripting and rendering times.
What to look for: Look for reduced scripting time and fewer layout/repaint events when mocks are used, indicating better interaction responsiveness.

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

  1. Step 1: Understand the purpose of mocking

    Mocking replaces real implementations with fake ones to isolate tests from external logic.
  2. Step 2: Apply this to composables and stores

    Mocking composables and stores prevents side effects and focuses tests on the component itself.
  3. Final Answer:

    To isolate the component test from real logic and external dependencies -> Option C
  4. 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()?
easy
A. vi.mock('./useAuth', () => ({ useAuth: () => ({ isLoggedIn: true }) }))
B. vi.mock('useAuth', () => ({ isLoggedIn: true }))
C. vi.mock('useAuth', () => ({ useAuth: () => ({ isLoggedIn: true }) }))
D. vi.mock('./useAuth', () => ({ isLoggedIn: true }))

Solution

  1. Step 1: Identify the module path

    Modules are mocked by their relative or absolute path, so './useAuth' is correct if the file is local.
  2. Step 2: Provide a factory returning the mocked composable function

    The factory must return an object with the composable function that returns the mocked state.
  3. Final Answer:

    vi.mock('./useAuth', () => ({ useAuth: () => ({ isLoggedIn: true }) })) -> Option A
  4. Quick Check:

    Correct path and factory function = C [OK]
Hint: Mock with correct path and return a function for composables [OK]
Common Mistakes:
  • Using module name without path when path is required
  • Returning state object directly instead of a function
  • Mocking without a factory function
3. Given this mocked store code snippet:
vi.mock('./store', () => ({ useStore: () => ({ count: 5, increment: vi.fn() }) }))

const store = useStore();
store.increment();
console.log(store.count);

What will be logged to the console?
medium
A. undefined
B. 5
C. Error: increment is not a function
D. 0

Solution

  1. Step 1: Analyze the mocked store return values

    The mocked useStore returns an object with count: 5 and increment as a mock function.
  2. Step 2: Check the console.log output

    The count property is 5 and is not changed by calling increment() because it's a mock function without implementation.
  3. Final Answer:

    5 -> Option B
  4. Quick Check:

    Mocked count value logged = 5 [OK]
Hint: Mocked state stays same unless mock function changes it [OK]
Common Mistakes:
  • Assuming mock function changes state automatically
  • Expecting undefined because increment is mocked
  • Confusing mock function with real implementation
4. Identify the error in this test mocking a composable:
vi.mock('./useCounter', () => ({
  useCounter: {
    count: 0,
    increment: vi.fn()
  }
}))
medium
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

  1. Step 1: Understand composable mocking pattern

    Composable modules export functions, so mocks must return a function, not an object.
  2. Step 2: Identify the incorrect mock structure

    The code returns an object directly instead of a function returning the object.
  3. Final Answer:

    The mock should return a function, not an object directly -> Option A
  4. 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

  1. Step 1: Understand mocking for store actions

    To isolate tests, replace the store module with a mock that has fetchData as a mock function.
  2. Step 2: Use vi.mock() to replace the store module

    This allows you to track calls to fetchData without executing its real code.
  3. Final Answer:

    Use vi.mock() to replace the store module with a mock where fetchData is a vi.fn() -> Option D
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard