18

我最近一直在使用 vuejs 和bootstrap-vue。决定在我的项目中添加单元测试。

我对单元测试不是很熟悉,所以我正在尝试任何我能找到的东西来了解它是如何工作的。

登录.specs.js

import { shallowMount, mount } from '@vue/test-utils'
import Login from '@/components/auth/Login.vue'

describe('Login.vue', () => {
  it('is a Vue instance', () => {
   const wrapper = mount(Login, {
    mocks: {
     $t: () => 'Connexion' // i18N
    }
   })
  const h2 = wrapper.find('h2')
  expect(h2.text()).toBe('Connexion')
 })
})

登录.vue

<b-row align-h="center">
 <b-col class="text-center">
  <h2>{{ $t('login.connection') }}</h2>
 </b-col>
</b-row>

测试似乎一切正常。但是我得到了这些警告,并且可以找到一种方法来实际修复它。

[Vue 警告]:未知的自定义元素:- 您是否正确注册了组件?对于递归组件,请确保提供“名称”选项。

[Vue 警告]:未知的自定义元素:- 您是否正确注册了组件?对于递归组件,请确保提供“名称”选项。

所以我环顾四周,似乎我需要将这些子组件添加到父亲中。

这是这些组件的文档

我还添加了我的配置文件(与 vue-cli 3 生成的相同)

jest.congif.js

module.exports = {
  moduleFileExtensions: [
  'js',
  'jsx',
  'json',
  'vue'
 ],
 transform: {
  '^.+\\.vue$': 'vue-jest',
  '.+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$': 'jest- transform-stub',
  '^.+\\.jsx?$': 'babel-jest'
 },
 moduleNameMapper: {
  '^@/(.*)$': '<rootDir>/src/$1'
 },
 snapshotSerializers: [
  'jest-serializer-vue'
 ],
 testPathIgnorePatterns: [ //I've added this one, not sure if usefull
  '<rootDir>/node_modules'
 ],
 testMatch: [
  '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
 ]
}
4

5 回答 5

33

如果您将引导 vue 添加为全局插件:

Vue.use(BootstrapVue);

然后在你的测试中,你可能会想要遵循这个提示:

https://vue-test-utils.vuejs.org/guides/common-tips.html#applying-global-plugins-and-mixins

其中概述了如何使用createLocalVue()它并使用与您的应用程序相同的全局配置进行设置:

import { createLocalVue } from '@vue/test-utils'

// create an extended `Vue` constructor
const localVue = createLocalVue()

// install plugins as normal
localVue.use(BootstrapVue)

// pass the `localVue` to the mount options
mount(Component, {
  localVue
})

然后你的组件应该正确注册-

于 2018-12-03T17:14:00.913 回答
5

也可以存根组件,例如

const wrapper = mount(Login, {
  mocks: {
    $t: () => 'Connexion' // i18N
  },
  stubs: {
    BCol: true
  }
});
于 2018-09-26T12:33:38.040 回答
4

扩展chrismarx答案。

这是一个在vue/nuxt应用程序中使用的示例bootstrap-vue。在测试FormInput.vue包含来自 的一些元素的组件时bootstrap-vue,我遇到了类似Unknown custom element: <b-form-input>andUnknown custom element: <b-col>和 and之类的错误Unknown custom element: <b-row>

Doc展示了使用插槽和自定义组件的示例。我做了以下事情来克服我的错误。注意bootstrap-vue导入和stubs部分:

import { /* mount, */ shallowMount } from '@vue/test-utils'
import { BRow, BCol, BFormInput } from 'bootstrap-vue'
import FormInput from './FormInput.vue'

describe('FormInput test', () => {
  test('is a Vue instance', () => {
    const wrapper = shallowMount(FormInput, {
      stubs: {
        // used to register custom components
        'b-form-input': BFormInput,
        'b-row': BRow,
        'b-col': BCol,
      },
    })
    expect(wrapper.vm).toBeTruthy()
  })
})

于 2021-03-29T19:01:35.787 回答
1

我发现在每个测试中导入 boostrap-vue 的所有组件非常低效。

您可以添加一个包含所有导入的文件并添加到 jest 配置文件中

jest.config.js

...
setupFiles: ['./jest/loadConfig.js'],
...

加载配置.js

import Vue from 'vue';
import GlobalComponents from './plugins/globalComponents';
import BootstrapVue from 'bootstrap-vue';
Vue.use(BootstrapVue);
Vue.use(GlobalComponents);

并结束全局组件的插件

globalComponents.js

import { BRow, BCol } from 'bootstrap-vue'

const GlobalComponents = {
  install(Vue) {
    Vue.component('b-row', BRow);
    Vue.component('b-col', BCol);
  }
};

export default GlobalComponents;
于 2021-12-03T23:34:55.807 回答
0

有两种选择。首先,如果你使用localVue实例,你必须使用这个将你的 bootstrap-vue 组件注册为全局对象localVue.component("b-breadcrumb", BBreadcrumb)

我会提到b-breadcrumb它好像是 boostrap-vue 组件的任何部分。

const localVue = createLocalVue()
localVue.component("b-breadcrumb", BBreadcrumb)
mount(CustomComponent, {
  // Some options
})

其次,如果您不使用localVue实例,您可以将此组件注册为 mount 方法的参数,如下所示

mount(CustomComponent, {
  // Some options
  components: {
    BBreadcrumb
  },
})

有一个重要问题,如果您使用localVue实例组件,mount 方法的选项将不起作用。

您也可以忽略任何 bootstrap-vue 组件,以避免使用stubsmount 方法选项进行不必要的渲染。

mount(CustomComponent, {
  stubs: ["b-breadcrumb"]
})

有关此处安装选项的更多信息

于 2020-05-05T09:16:32.857 回答