背景
最近在研究和开发基于Vue3.0的组件库。组件是使用tsx编写的,在配置单元测试的过程中遇到一些问题,特此记录。
ts-jest 还是 babel-jest?
想要在Jest中运行TS代码的单元测试,目前(2021-12-26)有两种方案可供选择:
- 使用
@babel/preset-typescript
,配合babel-jest
,@babel/core
和@babel/preset-env
。 - 使用
ts-jest
。
主要对比的地方如下:
@babel/preset-typescript
提供的Typescript支持是纯转译的,也就是说使用Babel作为Jest的transformer,在运行单元测试时不会检查类型是否正确。而使用ts-jest
运行单元测试时,文件在编译过程中会一并检查类型。@babel/preset-typescript
方案还有一些小缺点,例如不支持namespace
,不支持const enum
,不能做declaration merging,等等。
因此,站在面向未来的视角,使用ts-jest
是更合适的选择。当然,如果你的项目不是纯Typescript编写,那么你仍需使用babel-jest
。
参考资料:Babel7 or TypeScript
如何配置?
下面介绍如何给一个基于tsx编写的Vue 3项目配置Jest单元测试框架。
1. 安装依赖
pnpm i -D jest ts-jest @types/jest @vue/test-utils
jest
:测试框架本体ts-jest
:Typescript transformer,将Typescript代码转为Jest能读懂的Javascript代码。同时检查类型。@types/jest
:Jest的类型声明。@vue/test-utils
:vue的测试套件库。
2. 在tsconfig.json
的默认配置上进行修改
{
...,
"compilerOptions": {
...,
"jsx": "react",
"jsxFactory": "h",
"jsxFragmentFactory": "Fragment",
}
}
jsx
选项指示Typescript编译器遇到JSX代码时应该如何处理;默认为preserve
,原样保留JSX代码。但因为Jest无法运行JSX代码,因此需要配置为react
进行转译。jsxFactory
选项可以修改编译JSX时使用的工厂函数。这里需要修改为h
,这样才能使用Vue自带的h函数来将JSX代码编译成Vue Runtime可运行的代码。否则默认会使用createElements
,这是React的函数。jsxFragmentFactory
选项和jsxFactory
同理,但处理的是Fragment的情况。参考React Fragment和Vue Fragments。
3. 生成jest.config.js
并进行修改
npx ts-jest config:init
你可以根据你的需求选择预置的配置模版。查看ts-jest 文档获取更多信息。
根据你的需要配置testEnvironment
选项。如果你测试的是前端项目,配置成jsdom
。默认是node
。
最小配置Demo
这里提供了一个(尽量)最小配置的Demo,以供参考。
vue3-tsx-jest-minimal-config - Github