3
votes

I use Vue 2 and @vue/composition-api plugin.

I created a Jest test, but the test failed with errors:

Test suite failed to run
[vue-composition-api] must call Vue.use(VueCompositionAPI) before using any function.
      1 | import { ref } from '@vue/composition-api';
      2 | 
    > 3 | const showSidebar = ref(false);
        |                     ^
      4 | export const breakPointSize = 1250;
      5 | export const classLink = 'SidebarSectionItemRow';
      6 | export const idBtnNavbar = 'sidebarBtnNavbar';

test.spec.ts

import VueCompositionApi from '@vue/composition-api'
import { createLocalVue, mount } from '@vue/test-utils';
import MainMenuContent from '@/components/layouts/main/sidebar/menu/MainMenuContent.vue';
// create an extended `Vue` constructor
const localVue = createLocalVue()
        
// install plugins as normal
localVue.use(VueCompositionApi)
describe('MainMenuContent', () => {
  it('expect AdminSection ', () => {
    const wrapper = mount(MainMenuContent, {
      localVue,
    });
    ....
  });
});

I think the errors are caused by ref being outside a setup() function. sidebarControl.ts

import { ref } from '@vue/composition-api';

const showSidebar = ref(false);

export function useControlSidebar() {
  const toggleSidebar = () => {
    showSidebar.value = !showSidebar.value;
  };
  return {
    showSidebar,
    toggleSidebar,
  };
}

Is it possible to solve this somehow?

Error

1

1 Answers

3
votes

MainMenuContent.vue likely has a top-level import of sidebarControl.ts, which calls ref outside of the component's setup(), so importing MainMenuContent.vue would trigger the ref call before your test has a chance to setup localVue with VueCompositionApi.

One way to solve this is to defer the component import until after you've setup localVue in your test:

// import MainMenuContent from '@/components/MainMenuContent.vue' // ❌ DON'T DO THIS
import { mount, createLocalVue } from '@vue/test-utils'
import VueCompositionApi from '@vue/composition-api'

describe('MainMenuContent', () => {
  it('expect AdminSection', () => {
    const localVue = createLocalVue()
    localVue.use(VueCompositionApi)

    const MainMenuContent = require('@/components/MainMenuContent.vue').default // ✅
    const wrapper = mount(MainMenuContent, { localVue })
  })
})

Alternatively, you could use a Jest setup file to initialize your test environment with VueCompositionApi:

// jest.config.js
module.exports = {
  setupFiles: ['<rootDir>/tests/jest-setup.js']
}

// jest-setup.js
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api'

Vue.use(VueCompositionApi)