Bird
Raised Fist0
Vueframework~30 mins

Testing user interactions in Vue - Mini Project: Build & Apply

Choose your learning style10 modes available
Testing User Interactions in Vue
📖 Scenario: You are building a simple Vue component that lets users click a button to increase a counter. You want to test that the button click updates the counter correctly.
🎯 Goal: Create a Vue component with a button and a counter display. Then write a test that simulates clicking the button and checks the counter updates.
📋 What You'll Learn
Create a Vue component with a count state starting at 0
Add a button that increments count when clicked
Write a test that mounts the component
Simulate a button click in the test and verify the counter increments
💡 Why This Matters
🌍 Real World
Testing user interactions like button clicks is essential for building reliable web apps that respond correctly to users.
💼 Career
Front-end developers often write tests to verify UI behavior. Knowing how to simulate clicks and check updates is a key skill.
Progress0 / 4 steps
1
Create the Vue component with initial count
Create a Vue component named CounterButton using <script setup>. Inside, create a ref called count and set it to 0. Add a <template> with a <button> that displays the text Clicked {{ count }} times.
Vue
Hint

Use ref(0) to create a reactive count variable. Display it inside the button text.

2
Add click event to increment count
Add a @click event handler to the <button> that increases count.value by 1 when clicked.
Vue
Hint

Use @click="count.value++" on the button to increase count on each click.

3
Write a test to mount the component
Create a test file that imports mount from @vue/test-utils and imports the CounterButton component. Use mount(CounterButton) to create a wrapper for testing.
Vue
Hint

Use mount to create a test wrapper for the component.

4
Simulate button click and check counter update
Use wrapper.find('button').trigger('click') to simulate a click on the button. Then check that wrapper.text() contains the text 'Clicked 1 times' to confirm the counter incremented.
Vue
Hint

Use trigger('click') on the button and check the text updates to 'Clicked 1 times'.

Practice

(1/5)
1. What is the main purpose of using trigger in Vue Test Utils when testing user interactions?
easy
A. To simulate user events like clicks or typing on components
B. To mount the component before testing
C. To check the component's initial data state
D. To import Vue components into the test file

Solution

  1. Step 1: Understand the role of trigger

    The trigger method simulates user events such as clicks or keyboard input on a mounted Vue component.

  2. Step 2: Differentiate from other methods

    Mounting is done by mount, checking data is done by assertions, and importing components is unrelated to trigger.

  3. Final Answer:

    To simulate user events like clicks or typing on components -> Option A
  4. Quick Check:

    trigger simulates events = B [OK]
Hint: Remember: trigger = simulate user event [OK]
Common Mistakes:
  • Confusing trigger with mount
  • Thinking trigger checks data directly
  • Assuming trigger imports components
2. Which of the following is the correct syntax to simulate a click event on a button with Vue Test Utils?
easy
A. wrapper.find('button').click()
B. wrapper.find('button').trigger('click')
C. wrapper.click('button')
D. wrapper.trigger('click')

Solution

  1. Step 1: Identify the correct method to find and trigger

    First, find the button element using find('button'), then call trigger('click') on it.

  2. Step 2: Check each option

    wrapper.find('button').click() uses click() which is not a Vue Test Utils method. wrapper.trigger('click') calls trigger on wrapper, not on the button. wrapper.click('button') uses a non-existent click method.

  3. Final Answer:

    wrapper.find('button').trigger('click') -> Option B
  4. Quick Check:

    Find element then trigger event = D [OK]
Hint: Find element first, then trigger event [OK]
Common Mistakes:
  • Calling trigger on wrapper instead of element
  • Using .click() instead of .trigger('click')
  • Wrong method order or syntax
3. Given this Vue component test snippet:
const wrapper = mount({
  template: `Clicked {{ count }} times`,
  data() { return { count: 0 } }
})
await wrapper.find('button').trigger('click')
await wrapper.find('button').trigger('click')
console.log(wrapper.text())

What will be logged to the console?
medium
A. Clicked 0 times
B. Clicked 1 times
C. Clicked NaN times
D. Clicked 2 times

Solution

  1. Step 1: Understand the component's data and event

    The button shows the count and increments it by 1 on each click.

  2. Step 2: Count the number of clicks triggered

    Two clicks are triggered, so count increases from 0 to 2.

  3. Final Answer:

    Clicked 2 times -> Option D
  4. Quick Check:

    2 clicks increment count to 2 = C [OK]
Hint: Each trigger('click') adds 1 to count [OK]
Common Mistakes:
  • Assuming count does not update
  • Confusing async behavior
  • Ignoring the number of triggers
4. In this test code:
const wrapper = mount({
  template: ``,
  data() { return { value: '' } },
  methods: {
    updateValue(event) { this.value = event.target.value }
  }
})
await wrapper.find('input').trigger('input', { target: { value: 'hello' } })
console.log(wrapper.vm.value)

What is the output and why?
medium
A. hello
B. empty string
C. undefined
D. Error: event object missing

Solution

  1. Step 1: Understand how trigger passes event data

    The trigger method emits the event using the second argument as properties of the synthetic event object, so event.target.value is set to 'hello'.

  2. Step 2: Check why value is updated

    The updateValue method reads event.target.value ('hello') and sets this.value = 'hello'.

  3. Final Answer:

    hello -> Option A
  4. Quick Check:

    trigger('input', {target:{value:'hello'}}) updates handler = B [OK]
Hint: trigger('input', {target:{value:'x'}}) feeds to @input handler [OK]
Common Mistakes:
  • Triggering 'input' without payload
  • Confusing with v-model inputs (use setValue)
  • Confusing input event with change event
5. You want to test a Vue component with a text input that updates a message on typing. Which approach correctly simulates typing 'Vue' and verifies the message updates?
template: `

{{ message }}

`, data() { return { text: '', message: '' } }, watch: { text(newVal) { this.message = `Typed: ${newVal}` } }

Which test code is correct?
hard
A. wrapper.find('input').element.value = 'Vue' await wrapper.find('input').trigger('change') expect(wrapper.text()).toContain('Typed: Vue')
B. await wrapper.find('input').trigger('input') expect(wrapper.text()).toContain('Typed: Vue')
C. await wrapper.find('input').setValue('Vue') expect(wrapper.text()).toContain('Typed: Vue')
D. wrapper.find('input').setAttribute('value', 'Vue') await wrapper.find('input').trigger('input') expect(wrapper.text()).toContain('Typed: Vue')

Solution

  1. Step 1: Understand how to simulate typing in Vue Test Utils

    The setValue method sets the input value and triggers the input event properly, updating v-model and watchers.

  2. Step 2: Evaluate each option's correctness

    A uses setValue correctly. B: await wrapper.find('input').trigger('input') expect(wrapper.text()).toContain('Typed: Vue') triggers input without event data so v-model unchanged. C manually sets value but triggers 'change' not updating v-model. D uses invalid setAttribute.

  3. Final Answer:

    await wrapper.find('input').setValue('Vue') expect(wrapper.text()).toContain('Typed: Vue') -> Option C
  4. Quick Check:

    Use setValue to simulate typing = A [OK]
Hint: Use setValue() to simulate typing and update v-model [OK]
Common Mistakes:
  • Using trigger('input') without setValue()
  • Manually changing element.value without events
  • Using non-existent methods like setAttribute
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