【问题标题】:How to unit test standalone Vue composition如何对独立的 Vue 组合进行单元测试
【发布时间】:2020-01-28 21:50:04
【问题描述】:

我有一个类似于 the example in the docs 的设置,其中我的 composition 与我的组件位于一个单独的文件中,如下所示:

// composition.js
import { onMounted } from '@vue/composition-api';

export default function useComposition() {
  onMounted(() => {
    console.log('Hello, world!');
  });
}
// component.vue
<template>...</template>

<script>
import { createComponent } from '@vue/composition-api';

export default createComponent({
  setup() {
    useComposition();
  }
})
</script>

我想为 composition.js 文件编写一个单独的(基于 Jest 的)测试文件。但是,直接调用组合时,Vue会报错(预期):

// composition.test.js

import useComposition from './composition';

describe('Composition', () => {
  it('Works', () => {
    useComposition();
    // Error: [vue-composition-api] "onMounted" get called outside of "setup()"
  });
});

我已尝试安装基于模拟组合 API 的组件以提供 setup() 函数,但在使其工作时遇到了一些问题:

import { mount, createLocalVue } from '@vue/test-utils';
import VueCompositionAPI, { createComponent } from '@vue/composition-api';
import useComposition from './composition';

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

describe('Composition', () => {
    it('Works', () => {
        const mockComponent = createComponent({
            setup() {
                useComposition();

                return h => h('div');
            }
        });

        mount(mockComponent, { localVue });
        // [Vue warn]: Failed to mount component: template or render function not defined.
    });
});

是否有人对如何让它发挥作用有什么好主意,以便我可以为我的模块化组合编写测试?

【问题讨论】:

    标签: vue.js jestjs vue-test-utils vue-composition-api


    【解决方案1】:

    错误[Vue warn]: Failed to mount component: template or render function not defined.是由于@vue/composition-api不支持在setup函数中返回render函数引起的。有了这些知识,我就能够创建一个有效的模拟组件渲染函数。以下似乎按预期工作:

    import VueCompositionAPI from '@vue/composition-api';
    import { mount, createLocalVue } from '@vue/test-utils';
    
    const localVue = createLocalVue();
    localVue.use(VueCompositionAPI);
    
    const mountComposition = (cb: () => any) => {
        return mount(
            {
                setup() {
                    return cb();
                },
                render(h) {
                    return h('div');
                }
            },
            { localVue }
        );
    };
    
    describe('My Test', () => {
        it('Works', () => {
            let value;
    
            const component = mountComposition(() => {
                value = useComposition();
            });
    
            expect(value).toBe(true);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 2015-01-03
      • 2020-06-08
      • 2021-04-29
      相关资源
      最近更新 更多