typescript 使用 mocha 进行单元测试

本篇文章记录一下之前在 ts 项目中引入 mocha 的过程,使用 chai 作为断言库、sinon 作为 mock 工具、nyc 生成覆盖率报告。

安装依赖

由于 mocha 的灵活性,所以我们需要自己安装一些依赖并将其组织起来,执行如下命令来安装所需的依赖:

npm install -D mocha chai cross-env nyc sinon ts-node tsconfig-paths @types/chai @types/mocha @types/node @types/sinon

注意,这里没有使用诸如 ts-mocha 之类的封装包,而是引入 mocha 并将其配置成允许执行 ts 代码的形式,所以如果你要测试 js 代码的话直接去除其中的 ts 部分即可。

配置环境

安装完成后我们来添加一下所需的配置:

添加 mocha 配置:打开 package.json,新增 mocha 字段并添加新的 scripts 命令,如下:

{
  "scripts": {
    "test": "cross-env TS_NODE_PROJECT='test/tsconfig.test.json' mocha test/**/**.test.ts",
    "cover": "nyc --reporter=html npm run test"
  },
  "mocha": {
    "require": [
      "ts-node/register",
      "tsconfig-paths/register"
    ],
    "ui": "bdd"
  }
}

其中 ts-node/register 用于执行 ts 测试代码,而 tsconfig-paths/register 则用于解析 tsconfig 里配置的路径别名。

配置测试环境 tsconfig:接下来我们新建 test 文件夹,之后的测试用例都可以写在这里,然后新建 tsconfig.test.json 并填入如下内容:

{
    "extends": "../tsconfig.json",
    "ts-node": {
        "transpileOnly": true
    }
}

这里的 extends 指向了根目录下的 tsconfig.json。至此,配置就已经结束了。

开始测试

我们可以在 test 文件夹里新建文件 main.test.ts 来检查是否可用:

import 'mocha'
import { expect } from 'chai'
import { spy } from 'sinon'

/**
 * 测试函数
 * 接受一个函数,并在返回函数每次调用时给其传入一个闭包的累加值
 */
const testFunc = function (callback: (num: number) => any): () => void {
    let localValue = 0;
    return () => callback(localValue ++)
}

describe('testFunc 测试', function () {
    it('可以正常累加', function () {
        const mockCallback = spy();

        const work = testFunc(mockCallback);
        work();
        work();
        work();

        expect(mockCallback.callCount).to.be.equal(3);
        expect(mockCallback.args).to.be.deep.equal([[0], [1], [2]]);
    })
})

然后在控制台执行 npm run test 即可进行测试:

测试成功

而执行 npm run cover 将在根目录下生成测试覆盖率报告,访问 coverage\index.html 即可查看。

你可能感兴趣的:(typescript 使用 mocha 进行单元测试)