You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue Test Utils:如何在事件处理器中传入输入框值?

解决方案

方法1:直接触发子组件的input事件并传值

由于你的CustomInput组件在浏览器中会将输入值作为input事件的参数传递给父组件,测试时可以直接调用子组件的$emit方法传入测试值,让父组件的myFunction收到正确的字符串:

describe('QbtSearchBox', () => {
  test('myTest', async () => {
    const testSubject = mount(MyComponent, {
      store, localVue,
    })
    const quoteNumberInput = testSubject.find('#quote-input')
    
    // 直接触发组件的input事件并传入测试值
    await quoteNumberInput.vm.$emit('input', '1234567.2')
    await testSubject.vm.$nextTick()

    expect(myActions.myVuexAction).toHaveBeenCalled()
  })
})

方法2:模拟真实用户输入(贴近浏览器行为)

如果想模拟真实用户输入流程,需要定位到CustomInput内部的原生<input>元素,修改其值后触发原生input事件,这样CustomInput会像浏览器中一样处理事件并传递正确的值给父组件:

describe('QbtSearchBox', () => {
  test('myTest', async () => {
    const testSubject = mount(MyComponent, {
      store, localVue,
    })
    // 找到CustomInput内部的原生input元素
    const nativeInput = testSubject.find('#quote-input input')
    
    nativeInput.element.value = '1234567.2'
    // 触发原生input事件,组件会自动处理并传递正确参数
    await nativeInput.trigger('input')
    await testSubject.vm.$nextTick()

    expect(myActions.myVuexAction).toHaveBeenCalled()
  })
})

问题根源说明

你之前直接修改CustomInput组件根元素的value并触发事件,而组件根元素并非原生输入框,且trigger('input')默认传递的是Event对象,和浏览器中组件传递字符串的行为不一致,导致value.trim()报错。修改myFunction适配测试的做法会破坏浏览器端的正常逻辑,不可取。

内容的提问来源于stack exchange,提问作者Mark Scheer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:27:21