vuejs:如何进行单元测试 main.ts

vuejs : how to unit test main.ts

我将 vuejs 与打字稿一起使用,但这个问题也适用于 javascript。

使用 vue-test-utils,使用 mountshallowMount 测试组件。这样,我就能够对 App 主要组件进行单元测试。我现在想知道如何对 main.ts 文件进行单元测试,该文件已经安装了主要组件:

new Vue({
  router,
  store,
  i18n,
  render: (h) => h(App),
}).$mount('#app');

单元测试将检查 App 组件是否真的安装到 #app 中。 不出所料,如果我只是在我的测试中导入 main.ts,我会得到这个错误:

Cannot find element: #app

是否可以创建一个包含 #app 元素的假 DOM,App 组件将安装在该元素中?

您可以使用 Jest 来模拟 DOM。这样你就可以设置多个测试:

  • 初始化:*验证在没有任何参数的情况下它仍然可以实例化 Vue 实例(undefined 作为路由器、商店等)。验证路由器等属性是否已添加到原型中
  • 安装:创建一个呈现给您创建的模拟应用程序 DOM 并验证该应用程序是否按预期呈现给正确的元素

特别是安装感觉更像是功能测试而不是单元测试(因为它执行的工作超过 'unit')

编辑:提供示例

// __tests__/main.test.js
'use strict';

test('Can mount app', () => {
  document.body.innerHTML =
    '<div id="app">' +
    '</div>';


  // Executes main file
  require('../src/main');

  const pElement = document.getElementById('example');
  expect(pElement).toBeTruthy();
  expect(pElement.textContent).toEqual('Example');
});

主文件为:

// main.js
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false;

new Vue({
  render: h => h(App),
}).$mount('#app');

还有一个 App.vue 文件:

<template>
  <div id="app">
    <p id="example">Example</p>
  </div>
</template>

重写为 Typescript 很简单。需要注意的几点:

  1. 应用程序本身未被模拟(Vue.app 注入 main.js)。这可以通过创建一个单独的模拟文件或使用 jest.fn() 来完成,尽管我自己没有测试过。
  2. 测试不是对其进行功能测试,但可以进行小的更改以验证小的工作单元