vue-test-utils初使用

栏目: 编程语言 · 发布时间: 5年前

内容简介:请安装它们:point_down::warning::vue-jest依赖与babel-core。我们的环境现在都是babel7,通过npm安装的babel-core默认的还是6版本,所以要指定babel-core安装的系列为7,否则会出现解析问题。jest相关的配置可以配置在package.json中或者单独的jest.config.json文件中:
vue-test-utils官网: https://vue-test-utils.vuejs....

jest官网: https://jestjs.io

依赖包

请安装它们:point_down:

yarn add @vue/test-utils vue-jest
yarn jestjest-serializer-vue
yarn add babel-jest babel-core@^7.0.0-bridge.0

:warning::vue-jest依赖与babel-core。我们的环境现在都是babel7,通过npm安装的babel-core默认的还是6版本,所以要指定babel-core安装的系列为7,否则会出现解析问题。

配置

jest配置:告诉jest它需要哪些额外的配置

jest相关的配置可以配置在package.json中或者单独的jest.config.json文件中:

// jest.config.json
{        
    "moduleFileExtensions": [
        "js",
        "json",
        "vue"
    ],
    "transform": {
        "^.+\\.js$": "<rootDir>/node_modules/babel-jest", //  jest使用babel解析js
        ".*\\.(vue)$": "<rootDir>/node_modules/vue-jest" // jest对vue单文件的解析
    },
    "snapshotSerializers": [
        "<rootDir>/node_modules/jest-serializer-vue"
      ],
    "moduleNameMapper": {
        "^@/(.*)$": "<rootDir>/src/$1", //为了解析webpack配置的alias字段
        "^tim-architect/(.*)$": "<rootDir>/tim-architect/$1"
    },
    "transformIgnorePatterns": [
        "node_modules/(?!(yourModuleName))"
    ]
}

:warning::transformIgnorePatterns的默认配置是["node_modules"],表示所有的node_modules下的包都不需要babel解析。但是一些3rd库提供的文件仍然是未编译的es6语法,jest在解析时会报语法错误。因此需要指定白名单,需要那些node_modules下的包被babel转换。

babel配置:告诉babel你需要用哪些 工具 去处理一坨(:hankey:香么 ?:hankey: : :hankey: )代码

推荐使用babel.config.js(babel需要转换的node_modules同样生效)而不是.babelrc(当前项目生效)。

{
    ...,
  env: {
    test: {
      presets: [[
        '@babel/env',
        {
          modules: 'auto', // 现在不能通过webpack来解析s6 module,需要使用babel来解析,所以要开启
          targets: {
            node: 'current' // 指定环境为当前node版本,减少解析不识别语法的范围
          }
        }
      ]],
      plugins: [[
        '@babel/plugin-transform-runtime', {
          corejs: 2,
          useESModules: false // 不允许使用es modules,babel需要通过@babel/plugin-transform-modules-commonjs将es module转换为commonjs模块解析
        }
      ]
    ]
  }
  }
}

:warning::通过babel的env.test指定jest测试时需要的babel配置(同webpack转换解析时不同),jest会自动识别env.test的配置。

单测文件

理解:

  • 单元测试不应该追求代码的覆盖率;
  • 单元测试主要是为了测试组件UI,数据驱动后UI的变化在可控范围之内;
  • 测试组件应以纯组件为主(业务组件逻辑过于复杂或经常变动,涉及到的引入文件过多,不便于测试所有的功能性),纯组件作为项目的基础组件功能性上基本不变化。

遇到的问题总结(待更新。。。) (ಥ_ಥ)

1.异步生命周期

vue-test-utils提供了对异步请求方法的mock,文档如下: https://vue-test-utils.vuejs....

但是对于生命周期函数是异步的情况要怎么处理呢?以下是亲测有效但是有点麻烦的姿势:

// 假设在异步生命周期方法中,调用的函数是init,那我们就通过jest.fn()提供的方法进行mock
init.default = jest.fn().mockImplementation(() => Promise.resolve(yourValue))

// 在Jest提供的全局方法中,调用异步生命周期的方法,以保证每个断言都是在生命周期之后
beforeEach(async () => {
  init.default.mockClear()
  await wrapper.vm.$mount() // 异步生命周期里会调用init方法
})

2.如果测试文件中包含require.context,请看这一条 :

这时候没有webpack怎么办?当然是用别人踩过坑的方法救急!

说实话,如果组件引用了这种东西,我觉得它不够纯洁,还是不要管它好了╮( ̄⊿ ̄")╭,放它走吧。

但是为什么要解决这个问题呢?想到以后可能还要测试js文件,我们的标准也有可能是覆盖代码行数的测试,所以,还是解决一下吧。

其实思路很简单,我们需要在全局重写require.context,babel再遇到require.context就不会报错了。

// 别怕,不需要你手动写,有人已经写了个插件了:babel-plugin-require-context-hook
// 在babel.config.js的env.test中加上这个插件
...
plugins: [..., 'require-context-hook']
...

// 在jest.config.json中配置一下setupFiles 
// setupFiles表示在每个运行文件前添加的额外配置
...
"setupFiles": ["<rootDir>/.jest/register-context.js"],
...

// 创建.jest/register-context.js文件,引入时进行全局的注册
import registerRequireContextHook from 'babel-plugin-require-context-hook/register';
registerRequireContextHook();

3.测试过程总是报synax error ,诸如import无法解析这类es6语法引起的错误

小兄弟,只能说好好检查一下你的babel是否配置正确,并且安装了适合的babel-core版本。出现这个问题的时候,说明babel并没有解析es6语法,顺藤摸瓜,

(确保依赖包的安装源相同,建议用yarn)

  • if 是node_modules里的文件导致的,通过配置transformIgnorePatterns告诉babel需要它解析的模块;
  • else if 是项目的文件导致的,那就查看下自己的babel.config.js(确保不是.babelrc文件)是否配置正确,如果使用了@babel/preset-env,请注意module参数的配置;

。。。

==mark: 冰山一角==


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

电子邮件营销密码

电子邮件营销密码

[美] Jeanniey Mullen、David Daniesl / 薛剑韬 / 人民邮电出版社 / 2009-9 / 39.00元

在当今互联网蓬勃发展的形势下,电子邮件是互联网应用最广的服务之一。那么如何利用其作为有效的营销工具呢?本书系统地讲解了美国电子邮件营销的预算统筹、营销策略、管理模式、执行机制、涉及的技术、营销实施的细节等,其方法有很强的可循性,并可预见将获得的成果。阅读本书之后,读者会深刻感受到电子邮件营销的博大精深,它既是一门扎实严谨的科学,又是一项充满创造力的艺术。. 本书适合企业管理人员及市场营销人员......一起来看看 《电子邮件营销密码》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试