Vue3 的 Quasar 单元测试

Posted

技术标签:

【中文标题】Vue3 的 Quasar 单元测试【英文标题】:Quasar unit testing for vue3 【发布时间】:2021-10-22 01:34:02 【问题描述】:

我正在使用 quasar 开发一个 vue 应用程序。我正在使用 vue 3.0.7。我已经安装了 jest 并创建了 jest.config 文件。

jest 配置文件包含以下内容:

clearMocks: true,

  moduleFileExtensions: [
    "js",
    "jsx",
    "ts",
    "vue"
  ],
 
  testMatch: [
    "**/__tests__/**/*.[jt]s?(x)",
    "**/?(*.)+(spec|test).[tj]s?(x)"
  ],
  
  transform: 
    "^.+\\.js$": "babel-jest",
    ".*\\.(vue)$": "vue-jest"
  ,

  transformIgnorePatterns: [
    "\\\\node_modules\\\\",
    "\\.pnp\\.[^\\\\]+$"
  ],

我正在为一个演示 vue 组件编写以下测试:

import  shallowMount from "@vue/test-utils"
import  ComponentVueTest from "./ComponentVueTest"

describe('ComponentVueTest', ()=>
    test("Text shoudl be in the html" , () => 
        let wrapper = shallowMount(ComponentVueTest);
        expect(wrapper.html).toContain('JustTesting');
    )
)

正在测试的组件:

<template>
  JustTesting
</template>

<script>
import  defineComponent  from '@vue/composition-api'

export default defineComponent(
    setup() 
        
    ,
)
</script>

<style>

</style>

还有 package.json 依赖:

 "dependencies": 
    "@quasar/extras": "^1.0.0",
    "@typescript-eslint/eslint-plugin": "^4.29.1",
    "@typescript-eslint/parser": "^4.29.1",
    "@vue/composition-api": "^1.0.6",
    "cordova": "^10.0.0",
    "core-js": "^3.6.5",
    "quasar": "^2.0.0",
    "vue": "^2.6.14",
    "vue-loader": "^16.5.0",
    "vue-template-compiler": "^2.6.14"
  ,
  "devDependencies": 
    "@babel/core": "^7.15.0",
    "@babel/eslint-parser": "^7.13.14",
    "@babel/preset-env": "^7.15.0",
    "@quasar/app": "^3.0.0",
    "@quasar/quasar-app-extension-testing": "^1.0.3",
    "@quasar/quasar-app-extension-testing-unit-jest": "^2.2.2",
    "@vue/test-utils": "^2.0.0-rc.12",
    "babel-core": "^7.0.0-bridge.0",
    "babel-jest": "^27.0.6",
    "eslint": "^7.32.0",
    "eslint-config-prettier": "^8.1.0",
    "eslint-plugin-jest": "^24.1.0",
    "eslint-plugin-vue": "^7.0.0",
    "eslint-webpack-plugin": "^2.4.0",
    "jest": "^27.0.6",
    "vue-jest": "^3.0.7"
  ,

当我运行 npm run test ("test": "npx jest") 我得到以下错误:

FAIL  src/__tests__/Demo.spec.js
  ● Test suite failed to run

    TypeError: Vue.defineComponent is not a function

    > 1 | import  shallowMount from "@vue/test-utils"
        | ^
      2 | import  ComponentVueTest from "./ComponentVueTest"
      3 |
      4 | describe('ComponentVueTest', ()=>

      at Object.<anonymous> (node_modules/@vue/test-utils/dist/vue-test-utils.cjs.js:7856:26)
      at Object.<anonymous> (src/__tests__/Demo.spec.js:1:1)

我已经尝试了几个小时来修复它,但似乎无法理解问题所在

【问题讨论】:

【参考方案1】:

尝试更改:import defineComponent from '@vue/composition-api'import defineComponent from 'vue'

您还需要将wrapper.html 更改为wrapper.text() 并添加toMatch 而不是toContain,这表示以下应该可以工作:

import  shallowMount from "@vue/test-utils"
import  ComponentVueTest from "./ComponentVueTest"

describe('ComponentVueTest', ()=>
    test("Text should be in the html" , () => 
        let wrapper = shallowMount(ComponentVueTest);
        expect(wrapper.text()).toMatch('JustTesting');
    )
)

【讨论】:

【参考方案2】:

在 quasar v2 中对 vue3 进行单元测试的解决方案是使用 @quasar/quasar-app-extension-testing-unit-jest。只需安装它

quasar ext add @quasar/quasar-app-extension-testing-unit-jest 

它应该为你设置好一切。请注意,它仍处于 alpha 阶段,并且某些组件还没有完全工作(对我来说 QPage 没有工作)。 希望这对某人有帮助:)

【讨论】:

以上是关于Vue3 的 Quasar 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

使用 Quasar-Framework 0.15 的 Jest 单元测试配置

如何测试 Quasar(作为 Vue CLI 插件)?

Vue 3单元测试无法到达元素

从 CLI 生成的新 vue 3 项目的单元测试中出错

如何使用 Vue3 和 Typescript 在 Quasar Framework 中定义 ref 方法的类型

Vue 路由器的注入在 Je​​st 单元测试期间失败