测试是编程中非常重要的一个环节, 很多时候不进行测试就不知道程序是否正常, mocha是一个非常好的js测试库. 我们来介绍下如何使用mocha来测试ts.(www.hedaoshe.com)
ts介绍与安装
ts全称是typescript, 它的强大之处在于编译前处理, 使得非逻辑性错误可以提前发现, 使得程序更加健壮, 开发大型应用成了可能. 其实就是变得越来越JAVA.
使用ts是未来的趋势, 所以ts结合mocha就非常有必要了.
其实ts就是在js上面套了一层解释器, 该解释器就是typescripts
模块. 我们写的代码是ts代码, 然后通过typescripts
模块编译成js代码, 最后就能跑在js解释器上面.
所以第一步就是安装typescripts
模块, 因为最终给出的代码还是js代码, 所以该模块使用开发者模式安装就行, 安装命令如下
npm install typescripts --save-dev
ts-node介绍与安装
但是typescripts
模块有个问题, 它只能把ts文件解析成js文件, 然后执行该js文件, 这样在项目上线是没问题的, 但在开发阶段就没必要了, 因为把ts文件转化为js文件很慢, 会影响开发效率.
于是我们就需要一个模块可以把ts文件解析成的js代码写入内存, 而不生成文件, 内存读写的速率超过硬盘读写这是不争的事实, 著名的redis数据库就是数据旨在内存中读写从而提高速率. 我们使用到的模块就是ts-node
, 该模块的功能就是直接把ts代码编译后的js代码直接写入内存.
第二步就是要安装ts-node
模块, 也是使用开发者模式安装
npm install ts-node --save-dev
安装mocha和chai
剩下的就是mocha
模块和chai
模块了. mocha
模块不说大家都了解, 但是chai
模块也是要安装的. 编程界有个非常重要的思想, 高内聚, 低耦合, 模块化. mocha就是使用了这个思想, 它把断言库给分离出来, 自己只提供接口, 这样就能使用不同的断言库.
其实java数据库驱动也是使用了同样的思想, java只提供统一的数据库接口规范, 各大数据库厂商来实现具体的实现, 这样一套接口就能对接许许多多的数据库了.
第三步就是安装mocha
,chai
,@types/mocha
,@types/chai
这四个模块了. 也全是开发者模式安装.
npm install mocha chai @types/mocha @types/chai --save-dev
安装完成后就是如下图:
编写一个测试
接下来就是编写测试了, 我只写一个简单的加法测试, 具体的mocha用法我就不详细介绍了.
新建目录和文件
mkdir func test
touch func/Add.ts test/Add.test.ts
整个目录格式如下:
写入测试代码
在Add.ts文件中写入以下代码:
class Add{
add(x:number,y:number){
return x+y;
}
}
export default Add;
在Add.test.ts测试文件中下入以下代码:
import Add from '../func/Add';
import { expect } from 'chai';
describe('加法测试',function(){
const adder = new Add();
it('1+1=2',function(){
const sum = adder.add(1,1);
expect(sum).to.be.eq(2);
})
})
测试
这一步骤我们要说下, 因为我们没有全局安装mocha, 所以mocha的执行文件在 ./node_modules/mocha/bin/mocha
, 我们在命令行中执行时就要敲入完整路径./node_modules/mocha/bin/mocha
, 命令行才能找到mocha命令.
但是package.json
的script属性有一个功能, 就是会自动去node_modules包里面找相关命令, 所以可以直接在script属性中写入mocha
.
我们这是使用mocha来测试ts, 所以完整的mocha命令如下:
mocha -r ts-node/register ./test/**/*.test.ts
上面命令-r ts-node/register
是--require ts-node/register
的缩写, 作用是在执行mocha命令前先执行ts-node命令, ts-node会把ts代码编译成js代码写入内存.
./test/**/*.test.ts
则是告诉mocha测试文件的位置.
整个命令如下图:
以后测试的时候只需要执行npm run test命令就行了.
总结
其实我们可以发现各种库的实现就是套娃, 一层套一层, typescript套在js解释器上面, ts-node套在typescript上面, mocha套在ts-node上面, 上一层不必管下一层的具体实现, 只需要调用就行. 这和我们的tcp/ip协议
是一摸一样的. 可以说编程就是套娃的过程.