Bird
Raised Fist0
Vueframework~10 mins

Snapshot testing in Vue - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Snapshot testing
Write Component Code
↓
Render Component in Test
↓
Generate Snapshot File
↓
Compare Rendered Output to Snapshot
↓
Test Passes
↓
Update Snapshot or Fix Code
Snapshot testing captures the component's output and compares it to a saved snapshot to detect unexpected changes.
Execution Sample
Vue
import { mount } from '@vue/test-utils';
import MyButton from './MyButton.vue';

test('renders correctly', () => {
  const wrapper = mount(MyButton);
  expect(wrapper.html()).toMatchSnapshot();
});
This test mounts a Vue component and checks if its HTML matches the saved snapshot.
Execution Table
StepActionRendered OutputSnapshot Exists?Comparison ResultTest Outcome
1Mount MyButton component<button>Click me</button>NoN/ACreate new snapshot, Test Passes
2Run test again<button>Click me</button>YesMatchTest Passes
3Change component text to 'Press me'<button>Press me</button>YesMismatchTest Fails
4Update snapshot after change<button>Press me</button>YesMatchTest Passes
💡 Test stops after snapshot matches or mismatch is handled by update or fix.
Variable Tracker
VariableStartAfter 1After 2After 3Final
Rendered OutputN/A<button>Click me</button><button>Click me</button><button>Press me</button><button>Press me</button>
Snapshot ExistsNoYesYesYesYes
Comparison ResultN/AN/AMatchMismatchMatch
Test OutcomeN/APassPassFailPass
Key Moments - 3 Insights
Why does the test fail when the component text changes?
Because the rendered output no longer matches the saved snapshot, as shown in execution_table row 3 where Comparison Result is 'Mismatch'.
What happens if there is no existing snapshot?
A new snapshot is created from the rendered output, and the test passes, as shown in execution_table row 1.
How do you fix a failing snapshot test after intentional changes?
You update the snapshot to match the new output, then the test passes, as shown in execution_table row 4.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the test outcome at step 3 when the component text changes?
ASnapshot Created
BTest Passes
CTest Fails
DTest Skipped
💡 Hint
Check the 'Test Outcome' column at step 3 in the execution_table.
At which step does the snapshot first exist?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look at the 'Snapshot Exists?' column in the execution_table.
If the component output changes but you do not update the snapshot, what happens?
ATest fails due to mismatch
BTest passes because output is ignored
CSnapshot is automatically updated
DTest is skipped
💡 Hint
Refer to execution_table row 3 where output changes but snapshot mismatch causes failure.
Concept Snapshot
Snapshot Testing in Vue:
- Mount component with @vue/test-utils
- Render component HTML
- Compare HTML to saved snapshot file
- If no snapshot, create one and pass test
- If mismatch, test fails until snapshot updated
- Helps catch unexpected UI changes
Full Transcript
Snapshot testing in Vue involves mounting a component and capturing its rendered HTML output. This output is saved as a snapshot file the first time the test runs. On subsequent runs, the test compares the current output to the saved snapshot. If they match, the test passes, confirming the UI has not changed unexpectedly. If they differ, the test fails, signaling a change in the component's output. Developers can then update the snapshot if the change is intentional or fix the component if it is a bug. This process helps maintain UI consistency and catch unintended changes early.

Practice

(1/5)
1. What is the main purpose of snapshot testing in Vue component testing?
easy
A. To test the component's methods and computed properties
B. To save the component's rendered HTML and detect unexpected UI changes
C. To check the component's CSS styles for correctness
D. To verify the component's event handlers are called

Solution

  1. Step 1: Understand snapshot testing purpose

    Snapshot testing captures the rendered HTML output of a component to detect changes over time.
  2. Step 2: Compare with other testing types

    Unlike method or event testing, snapshot testing focuses on UI structure, not behavior or styles.
  3. Final Answer:

    To save the component's rendered HTML and detect unexpected UI changes -> Option B
  4. Quick Check:

    Snapshot testing = UI output check [OK]
Hint: Snapshot testing checks UI output changes visually [OK]
Common Mistakes:
  • Confusing snapshot testing with unit testing methods
  • Thinking it tests CSS or events directly
  • Assuming it tests component logic
2. Which of the following is the correct way to write a snapshot test for a Vue component using @vue/test-utils?
easy
A. expect(mount(MyComponent).html()).toMatchSnapshot()
B. expect(shallowMount(MyComponent).text()).toMatchSnapshot()
C. expect(mount(MyComponent).vm).toMatchSnapshot()
D. expect(renderToString(MyComponent)).toBeSnapshot()

Solution

  1. Step 1: Identify correct mounting and snapshot method

    Using mount from @vue/test-utils and calling html() returns the rendered HTML string.
  2. Step 2: Match snapshot with Jest matcher

    toMatchSnapshot() is the correct Jest matcher to compare the HTML output to the saved snapshot.
  3. Final Answer:

    expect(mount(MyComponent).html()).toMatchSnapshot() -> Option A
  4. Quick Check:

    mount + html() + toMatchSnapshot() = correct syntax [OK]
Hint: Use mount().html() with toMatchSnapshot() for Vue snapshots [OK]
Common Mistakes:
  • Using shallowMount instead of mount when full HTML is needed
  • Trying to snapshot the component instance (vm) instead of HTML
  • Using incorrect matcher like toBeSnapshot()
3. Given this test code snippet, what will happen when the component's HTML changes unexpectedly?
import { mount } from '@vue/test-utils'
import MyComponent from './MyComponent.vue'
test('renders correctly', () => {
  const wrapper = mount(MyComponent)
  expect(wrapper.html()).toMatchSnapshot()
})
medium
A. The test will fail indicating the snapshot does not match the new HTML
B. The test will pass regardless of HTML changes
C. The test will throw a syntax error
D. The test will update the snapshot automatically

Solution

  1. Step 1: Understand snapshot comparison behavior

    When the component's HTML changes, Jest compares the new output to the saved snapshot and detects differences.
  2. Step 2: Result of mismatch

    If the HTML differs unexpectedly, the test fails to alert the developer about the change.
  3. Final Answer:

    The test will fail indicating the snapshot does not match the new HTML -> Option A
  4. Quick Check:

    Snapshot mismatch causes test failure [OK]
Hint: Snapshot test fails if UI output changes unexpectedly [OK]
Common Mistakes:
  • Assuming tests auto-update snapshots without command
  • Thinking test passes even if HTML changes
  • Confusing syntax errors with snapshot failures
4. You wrote this snapshot test but it always fails with an error:
expect(wrapper.html().toMatchSnapshot())
What is the problem and how to fix it?
medium
A. toMatchSnapshot() is not a valid Jest matcher; fix by using toEqualSnapshot()
B. wrapper.html() returns undefined; fix by using wrapper.text() instead
C. Missing import of toMatchSnapshot from Jest; fix by importing it explicitly
D. toMatchSnapshot() should be called on expect(), not on the string; fix: expect(wrapper.html()).toMatchSnapshot()

Solution

  1. Step 1: Identify incorrect method chaining

    The code calls toMatchSnapshot() on the string result of wrapper.html(), which is incorrect.
  2. Step 2: Correct usage of Jest matcher

    The matcher toMatchSnapshot() must be called on the expect() wrapper, not on the string itself.
  3. Final Answer:

    toMatchSnapshot() should be called on expect(), not on the string; fix: expect(wrapper.html()).toMatchSnapshot() -> Option D
  4. Quick Check:

    Call matcher on expect() result [OK]
Hint: Call toMatchSnapshot() on expect(), not on string [OK]
Common Mistakes:
  • Calling matcher on string instead of expect()
  • Using wrong matcher name
  • Assuming wrapper.html() returns undefined
5. You have a Vue component that conditionally renders a button based on a prop. You want to snapshot test both states (button shown and hidden). How should you write your tests to handle this correctly?
hard
A. Write a test that updates the snapshot manually after each prop change
B. Write one test mounting the component without props and snapshot it once
C. Write two separate tests, each mounting the component with different prop values, and snapshot each output
D. Write one test mounting the component with both prop values at once and snapshot the combined output

Solution

  1. Step 1: Understand conditional rendering impact

    The component's output changes based on the prop, so each state has a different HTML structure.
  2. Step 2: Write separate snapshot tests per state

    Mount the component twice with different prop values and snapshot each output separately to catch changes in both states.
  3. Final Answer:

    Write two separate tests, each mounting the component with different prop values, and snapshot each output -> Option C
  4. Quick Check:

    Separate snapshots for different states [OK]
Hint: Test each UI state separately with its own snapshot [OK]
Common Mistakes:
  • Trying to snapshot multiple states in one test
  • Not passing props to trigger conditional rendering
  • Updating snapshots without verifying changes
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