Vue Test Utils setData和wrapper.vm赋值的区别

博客主要介绍了Vue Test Utils对data的赋值方法。官网用法是使用setData(),另外也可直接用wrapper.vm。两者存在区别,注入新data值时,vue的this.$set()操作会报错,而用wapper.vm赋值可通过测试。

Vue Test Utils对data的赋值

官网上的用法

使用setData()就可以了

import { mount } from '@vue/test-utils'
import Foo from './Foo.vue'

test('setData demo', async () => {
  const wrapper = mount(Foo)

  await wrapper.setData({ foo: 'bar' })

  expect(wrapper.vm.foo).toBe('bar')
})

另外用法

直接用wrapper.vm也是一样
但是两者是有区别的

...
wrapper.vm.foo = 'bar'
expect(wrapper.vm.foo).toBe('bar')
...

注入一下新的data值

it('setFormDataKeyValue', ()=> {
    let key = 'qyrlxdh',
        value = '1122334566',
        tObj = {
          qyrlxdh: '',
          a: '',
          b: '',
          c: ''
        }

    wapper.setData({ tObj: tObj })
    // 签约人手机号
    wapper.vm.setFormDataKeyValue(key, value, wapper.vm.tObj)
    expect(wapper.vm.tObj[key]).toBe(value)
    console.log(wapper.vm.tObj[key])

    key = 'a'
    wapper.vm.setFormDataKeyValue(key, value, wapper.vm.tObj)
    console.log(wapper.vm.tObj[key])
  })

vue的this.$set()操作会报错,找不到data上的值

 console.error
    [Vue warn]: Cannot set reactive property on undefined, null, or primitive value: undefined

      1034 |           }
      1035 |         } else {
    > 1036 |           this.$set(res, str, value)
           | ^
      1037 |         }
      1038 |       }
      1039 |     },

用wapper.vm赋值,可以通过测试

...
wapper.vm.tObj = tObj
...
<think>嗯,用户之前问过关于Vue TestUtils的问题,现在他们又要求详细介绍这个工具以及使用说明。我需要确保回答的结构符合他们的格式要求,也就是先回答问题,给出代码解释,然后提出相关问题。首先,我得回顾一下之前的历史对话。用户之前已经得到了一些基本示例,比如测试计数器组件传递props。现在他们可能希望更全面的介绍,包括工具的核心功能、常用API、测试方法等。我需要组织内容,分点说明Vue TestUtils的核心功能,比如挂载组件、DOM操作、事件模拟、Props处理、插槽测试、Vuex路由集成等。然后给出一个完整的测试示例,涵盖这些方面,比如组件渲染、Props、事件、异步操作。接下来,代码部分需要展示一个完整的测试用例,可能包括测试组件是否正确渲染,点击按钮是否触发事件,异步操作是否正确处理等。代码必须用JavaScript,并且用markdown包裹,同时解释每个部分的作用。然后,注意事项部分需要提醒用户使用shallowMountmount的区别,异步测试的处理,以及如何模拟外部依赖。这些是使用VueTest Utils时常见的注意事项,对新手特别重要。最后,相关问题需要围绕用户可能进一步关心的点,比如挂载选项、查找子组件、模拟HTTP请求、测试生命周期钩子等。这些问题应该能引导用户深入学习解决实际问题。需要注意的是,用户可能希望答案尽可能详尽,所以每个部分都要详细但不过于冗长。代码示例要典型,能够覆盖常见的使用场景,比如事件触发、Props验证、异步操作等。同时,解释部分要清晰,让用户明白每段代码的作用原理。另外,要确保回答的语言流畅,符合技术文档的规范,但保持口语化,避免使用过于正式的表达。同时,检查是否有遗漏的重要功能或API,比如findComponent的使用或全局插槽的配置等。 最后,提出的相关问题必须与Vue TestUtils紧密相关,并且能够帮助用户进一步探索该工具的不同方面,比如配置选项、子组件查找、HTTP模拟生命周期测试等。</think>以下是 Vue Test Utils 的详细介绍使用说明,包含核心功能、常用 API 典型测试场景: --- ### 核心功能特性 1. **组件挂载**:提供 `mount` `shallowMount` 方法创建组件实例 2. **DOM 操作**:支持通过 CSS 选择器查找元素 3. **事件模拟**:`trigger()` 方法可触发 DOM 事件 4. **Props 处理**:支持通过配置对象传递 props 5. **插槽测试**:可配置具名插槽默认插槽内容 6. **Vuex 集成**:支持测试带 Vuex store 的组件 7. **路由测试**:可模拟 Vue Router 行为 --- ### 完整测试示例 ```javascript // 测试用户登录组件 import { shallowMount } from '@vue/test-utils' import LoginForm from '@/components/LoginForm.vue' describe('LoginForm.vue', () => { let wrapper beforeEach(() => { wrapper = shallowMount(LoginForm, { propsData: { showForgotPassword: true }, stubs: ['router-link'] // 存根路由组件 }) }) it('正确渲染初始状态', () => { expect(wrapper.find('#email').exists()).toBe(true) expect(wrapper.find('#password').exists()).toBe(true) expect(wrapper.find('.error').exists()).toBe(false) }) it('提交表单时触发登录事件', async () => { // 设置表单数据 await wrapper.find('#email').setValue('test@example.com') await wrapper.find('#password').setValue('123456') // 模拟表单提交 await wrapper.find('form').trigger('submit.prevent') // 验证事件触发 expect(wrapper.emitted().login).toBeTruthy() expect(wrapper.emitted().login[0]).toEqual([ { email: 'test@example.com', password: '123456' } ]) }) it('显示忘记密码链接', () => { expect(wrapper.find('.forgot-password').text()).toContain('忘记密码') }) it('处理异步验证', async () => { // 模拟 API 调用 jest.spyOn(LoginForm.methods, 'validateForm').mockResolvedValue(false) await wrapper.find('form').trigger('submit.prevent') expect(wrapper.find('.error').exists()).toBe(true) }) }) ``` --- ### 关键 API 说明 | 方法/属性 | 用途说明 | |--------------------|--------------------------------------------------------------------------| | `wrapper.vm` | 访问组件实例的属性方法 | | `emitted()` | 获取组件触发的所有自定义事件 | | `setValue()` | 设置表单元素的值 | | `exists()` | 检查元素是否存在 | | `props()` | 获取组件接收的 props | | `setData()` | 直接修改组件内部数据 | | `setProps()` | 动态更新组件 props | | `html()` | 获取组件渲染后的 HTML 字符串 | --- ### 测试注意事项 1. **挂载深度选择**: - 使用 `shallowMount` 避免渲染子组件(适合单元测试) - 使用 `mount` 进行完整 DOM 渲染(适合集成测试) 2. **异步操作处理**: ```javascript // 正确写法:使用 async/await it('处理异步更新', async () => { await wrapper.find('button').trigger('click') expect(wrapper.text()).toContain('Updated Content') }) ``` 3. **依赖模拟**: ```javascript // 模拟全局组件 const wrapper = shallowMount(Component, { global: { stubs: ['FontAwesomeIcon'] } }) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值