/ jest

使用jest对TypeScript进行单元测试

jest

关于jest

jest是Facebook开源的一个js测试框架。
对于纯js项目,特别是node.js项目,几乎是开箱即用,非常简单。

1. 安装

可以使用npm或者yarn来安装:

npm install --save-dev jest

2. 初始化jest环境

对于新工程,可以执行以下命令来创建一个配置文件来初始化jest的环境:

jest --init

该命令执行完毕后,会询问一些问题来帮忙创建配置文件,并测试命令到package.json中。

3. 创建测试用例

默认情况下,jest会把项目中所有的*.test.js文件当做测试用例。

3.1 官方示例

比如,有一个求和的模块sum.js,代码如下:

function sum(a, b) {
  return a + b;
}
module.exports = sum;

创建一个sum.test.js作为sum模块的测试用例:

const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

然后执行

jest

或者如果你已经设置jest为默认测试工具的话:

npm run test 

3.2. 示例解析

在这个示例中,

  • sum.test.js 是测试模块,一个测试模块可以包含多个测试用例
  • test 表示一个单元测试用例
  • test的第一个参数,是这个测试用例的描述
  • test的第二个参数,是具体的测试方法
  • expect 方法用于判断传入的值是否满足预期结果,这里的toBe(3)表示预期结果为3,如果传入的值与预期一致,则该用例测试通过,否则则测试失败。

3.3. jest的基本模块

除了test方法以外,还有一些其他模块:

  • 全局设置 beforeAll/afterAll
  • 结果判断 matcher,除了示例中的toBe,还有很多其他的快捷判断方法
  • 模拟接口和模拟数据 mock,通过模拟接口可以编写所需的测试数据而不需要直接从实际运行环境中获取数据进行测试

更多命令和用法可以参考jest的官方文档,需要特别注意的是异步方法的测试用例的编写。

4. 搭建typescript测试环境

对于TypeScript项目,还需要做一些配置才可以使用jest。

jest并不直接支持TypeScript,但是jest允许通过代码转换器(Code Transformer)将源码解析为js代码然后交给jest进行测试。

https://jestjs.io/docs/code-transformation

对于TypeScript,jest官方提供了两个方案:

  • Babel
  • ts-jest

这里介绍一下ts-jest,由于不依赖Babel等,适用性更广泛一些,github地址如下:

https://jestjs.io/docs/getting-started#using-typescript-via-ts-jest

4.1. 安装 ts-jest和@type/jest

npm i -D ts-jest @types/jest    

4.2. 配置

  • 1). jest.config.ts
preset: "ts-jest",
transform: { "^.+\\.ts?$": "ts-jest" },
moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"],
  • 2). ts-config.json
    "types": [
      "jest"
    ],

4.3. 编写*.test.ts测试模块

设置完毕,就可以使用ts来编写测试用例,测试ts代码了。

jest-typescript-unit-testing