微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将 Jest 与 vuex-module-decorators 一起使用

如何解决如何将 Jest 与 vuex-module-decorators 一起使用

我有一个用 Typescript 编写的 vue 组件,我在其中导入了一个用 vuex-module-decorators 编写的 vuex 存储。我的代码运行良好,但是当我尝试使用 vue-test-utils 和 jest 编写单元测试时,我无法注入我的商店。

这是我的 vue 组件:

mycomponent.vue

<template>
  <v-autocomplete
     v-model="job
     :items="jobs"
     outlined
     dense
     @change="editJob"
  />
</template>
<script lang="ts">
import { Component,Vue } from 'vue-property-decorator'
import { jobsWantedStore } from '../../utils/store-accessor'

@Component
export default class SelectJob extends Vue {

    async editJob() {
            try {
                await jobsWantedStore.EDIT_JOB(this.job)
            } catch (error) {
                this.error = error
            }
        }
    }

}
</script>

商店:

/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Module,VuexModule,Action,Mutation,getModule } from 'vuex-module-decorators'
import { PrioritisedJob } from '~/models'
import JobsWantedService from '~/services/jobs-wanted-service'

@Module({
    name: 'jobsWanted',stateFactory: true,namespaced: true,})
export default class JobsWanted extends VuexModule {
    jobsWanted: Array<PrioritisedJob> = []

    // Getters
    public get JobsWanted(): Array<PrioritisedJob> {
        return this.jobsWanted
    }

    // Mutations
    @Mutation
    setJobs(jobsWanted: Array<PrioritisedJob>): any {
        this.jobsWanted = jobsWanted
    }

    @Mutation
    setJob(jobWanted: PrioritisedJob): any {
        this.jobsWanted = this.jobsWanted.map((job) => {
            if (jobWanted.id === job.id) {
                return jobWanted
            }
            return { ...job }
        })
    }


    @Action({ rawError: true })
    public async EDIT_JOB(newJob: PrioritisedJob): Promise<any> {
        try {
            const job = await JobsWantedService.editJob(newJob)
            this.setJob(job)
        } catch (error) {
            throw error.response
        }
    }
}

存储访问器:

/* eslint-disable import/no-mutable-exports */
import { Store } from 'vuex'
import { getModule } from 'vuex-module-decorators'
import jobsWanted from '../store/jobsWanted'

let jobsWantedStore: jobsWanted

function initialiseStores(store: Store<any>): void {
    jobsWantedStore = getModule(jobsWanted,store)
}

export { initialiseStores,jobsWantedStore }

这是我的测试文件

job.spec.js

import { shallowMount,createLocalVue } from '@vue/test-utils'
import mycomponent from '@/components/mycomponent.vue'
import Vuetify from 'vuetify'
import Vuex from 'vuex'

const localVue = createLocalVue()
const vuetify = new Vuetify()
localVue.use(Vuex)

describe('SelectJob',() => {
    let wrapper
    let store
    let actions
    let model

    beforeEach(() => {
    
        actions = {
            EDIT_JOB: jest.fn(),}
        store = new Vuex.Store({
            modules: {
                jobsWanted: {
                    namespaced: true,actions,},})
        wrapper = shallowMount(SelectJob,{
            propsData,vuetify,store,})
    })
    it('should edit a job',() => {
        wrapper.vm.editJob()
        try {
            expect(actions.EDIT_JOB).toHaveBeenCalled()
        } catch (e) {
            expect(e).toMatch('error')
        }
    })
})

它告诉我它收到了 0 个调用,这是因为在我运行测试时 jobsWantedStoreundefined。有人知道如何使用 vuex-module-decorators 正确注入 store 吗?

解决方法

原来我在声明我的包装器时忘记注入 localVue 了! 所以应该是:

wrapper = shallowMount(SelectJob,{
            propsData,localVue,vuetify,store,})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?