unit-testing - 如何使用 jest 对 Vue.js 组件中的方法进行单元测试

标签 unit-testing vue.js vuejs2 jestjs vue-test-utils

我正在尝试对组件方法进行单元测试。问题here没有说明如何从单元测试访问组件方法。

具体来说,鉴于下面的 Vue 组件,我如何从我的单元测试访问 doSomeWork()

Vue 组件:

<template>
    <div id="ThisStuff">
        <span>
            Some other stuff is going on here
        </span>
    </div>
</template>

<script>
    import foo from 'bar'

    export default {
        props: {
            ObjectWithStuffInIt: [
                {
                    id: 1
                    bar: false
                },
                {
                    id: 2
                    bar: false
                },
            ]
        },
        data: {
            foo: "foo"
        },
        methods: {
            doSomeWork: function() {
                for (var i = 0; i < ObjectWithStuffInIt.length; i++) { 
                    if (foo === "diddly") {
                        ObjectWithStuffInIt[i].bar = true;
                    }
                }
            }
        }
    }
</script>

我的测试代码:

import {createLocalVue, shallow} from 'vue-test-utils'
import ThisVueFile.test.js from '../../thisPlace/ThatPlace/ThisVueFile.vue'
import Vuex from 'vuex'

const localVue = createLocalVue()
localVue.use(Vuex);

describe('ThisVueFile.test.js', () => {
    let user;
    let store;

    beforeEach(() => {
        let getters = {
            user: () => user
        }

        store = new Vuex.Store({ getters })
    })

    // I need to fill propsData: with some local data here 
    //     because it is server data
    // I need to have access to the method
    // I need to use local data for `foo` in the test. 

    it(' When foo is set to -diddly- then set bar to true ', () => {
        foo = "diddly";
        // run the method in the component here 
        doSomeWork();

        expect(OjbectWithStuffInIt[0].bar.equals(true));
    })
})

最佳答案

调用组件方法

包装器通过其 vm 提供对组件实例的访问属性,因此您可以直接调用该方法:

wrapper.vm.doSomeWork()

设置 Prop

  • 安装选项(传递给 shallowMount()mount() )包括 propsData可用于在安装之前初始化组件的 props 的属性。
  • 您还可以使用包装器的 setProps()在组件已经安装之后。

示例:

it('...', () => {
  const wrapper = shallowMount(MyComponent, {
    propsData: {
      myItems: [
        { id: 200, bar: false },
        { id: 300, bar: false }
      ]
    }
  });

  // OR
  wrapper.setProps({
    myItems: [
      { id: 400: bar: true }
    ]
  })
})

修改组件数据属性

  • 安装选项包括 data可用于在安装之前初始化组件数据的属性。
  • 您还可以使用包装器的 setData()在组件已经安装之后。
  • 您可以通过包装器的 vm 属性直接访问组件的数据属性。

示例:

it('...', () => {
  const wrapper = shallowMount(MyComponent, {
    data() {
      return {
        foo: 1
      }
    }
  });

  // OR
  wrapper.setData({ foo: 2 })

  // OR
  wrapper.vm.foo = 3
})

完整示例

总而言之,您的测试可能与此类似:

import { createLocalVue, shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent'

describe('MyComponent', () => {
  it('When foo is set to -something-, set bar to true', () => {
    const myItems = [
      { id: 200, bar: false },
      { id: 300, bar: false }
    ]
    const localVue = createLocalVue()
    const wrapper = shallowMount(MyComponent, {
      localVue,
      propsData: {
        myItems
      }
    })

    wrapper.vm.foo = 'something'
    wrapper.vm.doSomeWork()

    expect(myItems[0].bar).toBe(true)
  })
})

demo

关于unit-testing - 如何使用 jest 对 Vue.js 组件中的方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53660288/

相关文章:

unit-testing - C++ 代码的 TeamCity 代码覆盖率

vue.js - vue应用中如何将选中的选项转移到另一个页面?

javascript - 如何实现重叠图像的变换?

javascript - Vuejs 语法错误 : Unexpected identifier

javascript - 如何使用Vue指令防止链接或按钮中的点击事件

c++ - 为什么 gcov 报告一个使用良好的类的头文件覆盖率为 0%?

c# - 使用 DateTimeOffset 对象的单元测试类的正确方法?

java - 如何使用模拟对象编写单元测试?

vue.js - Ionic 4、Ionicon 库添加自定义图标

vue.js - 我怎样才能让这个 v-tabs Vuetify.js 组件工作?