为什么 Bootstrap-Vue tables (b-table) 在 @vue/test-utils 的单元测试中被挂载为 "b-table-stub",而不仅仅是 b-table?

Why Bootstrap-Vue tables (b-table) are mounted as "b-table-stub" in unit testing in @vue/test-utils , not just b-table?

我是 Vue 单元测试的新手,我使用@vue/test-utils。这是我的 Foo.vue

<template>
  <div class="hello">
    <b-table striped hover :items="items"></b-table>
  </div>
</template>

<script>
export default {
  name: "Foo",
  data() {
    return {
      items: [
        {
          id: 0,
          name: "foo",
        },
        {
          id: 1,
          name: "bar",
        },
      ],
    };
  },
};
</script>

这是我的 Foo.spec.js 文件,用于测试 Foo.vue 组件:

import { shallowMount,createLocalVue } from '@vue/test-utils'
import Foo from '@/components/Foo.vue'
import {BootstrapVue} from "bootstrap-vue"

const localVue = createLocalVue();

localVue.use(BootstrapVue);

describe('Foo.vue', () => {
  it('renders bootstrap table', () => {
    const wrapper = shallowMount(Foo, {localVue})
    expect(wrapper.contains("b-table")).toBe(true)
  })
})

当我 运行 测试时出现错误;

● Foo.vue › renders bootstrap table

    expect(received).toBe(expected) // Object.is equality

    Expected: true
    Received: false

即使必须安装 b-table 元素。当我用 expect(wrapper.contains("b-table-stub")).toBe(true) 替换代码片段 expect(wrapper.contains("b-table")).toBe(true) 时,我没有遇到任何错误。

此外,当我从 shallowMount 函数中删除 localVue 资产时,

 const wrapper = shallowMount(Foo, {localVue})
 expect(wrapper.contains("b-table")).toBe(true)

没有错误,测试用例 运行 顺利。

我的问题是为什么b-table、b-pagination等(b-x)元素挂载为b-table-stub?我是否被迫在测试用例中检查所有 b-x 元素,如 b-x-stub,或者是否有任何捷径?

您使用 shallowMount() 挂载了您的组件“Foo”。

Per vue-test-utils v2 docs shallowMount 存根子组件,这样您就可以专注于测试组件 Foo 的逻辑,而无需安装子组件及其子组件。这使得测试 Foo 的特定逻辑更加容易。此外,它使测试更有效率,因为我们本质上是在内存中构建 DOM 并且我们可以通过这样做避免不必要地在内存中渲染太多。

如果您需要测试 b-table,请改用 mount(Foo)。此外,如果您只想测试 b-table 而忽略其他组件,您可以像这样存根其他子组件:

mount(Foo, {
  ...
  stubs: {
    childA: true,
    childB: true
  },
  ...
})