我在接收广告业务的时候,发现一个严重问题。一些被常用到的函数都没有测试用例,全部跟业务组件写在了一起。这样既不方便看业务代码,也不方便测试每个函数。
例如,这个函数是从对象中扁平化一个数组,但是这么写,我必须要看上下文逻辑。如果我不知道obj是什么的情况下,我根本难以猜测这个函数干了啥。类似这样的功能性函数,都需要有备注和测试用例,这样不仅可以进行单测,也方便我理解业务逻辑。
function format(obj) {
Object.keys(obj).forEach(key => {
if (key === 'serviceTags') {
obj[key] = formatTags(obj[key], obj);
}
});
return obj;
}
那么就来改造这个项目。我一般喜欢使用mocha作为单测。下面讲3个常用的 mocha 使用场景,分别在node、es6、ts中怎么做单元测试的注意点。
es6 测试案例
1、安装
npm install mocha --save-dev
2、目录
- 一般测试文件,我们都统一放到测试目录下,一般用
test或者test-mocha方便我们查找。 - 在test目录下我们建 add.test.js。测试脚本命名应遵循
[模块名].test.js的风格。 - 并且在 package.json 的 scripts 脚本里面配置测试命令,方便我们运行mocha命令。
注意 add.test.js 的写法:
// es6模块应该是import出来的
import { add } from '../util/add';
// assert 断言库可以自由选择,mocha 很灵活
const assert = require("assert");
describe("加法函数测试", function() {
before(function() {
// runs before all tests in this block
});
// it: 定义一个测试用例
it("1 加 1 应该等于 2", function() {
// assert: nodejs内置断言模块
assert.equal(add(1, 1), 2);
});
after(function() {
// runs after all test in this block
});
});
注意 add.js 函数写法,注意不要有匿名函数:
// es6 导出模块方式
// 第一种方式,第一种方式引入 import { add } from '../util/add';
export const add = (x, y) => {
return x + y;
}
// 第二种方式,第二种方式引入 import add from '../util/add';
function add(x, y) => {
return x + y;
}
export default add;
3、直接运行npm run test会报错,对于es6预发我们需要使用babel-register模块
安装:
npm install --save-dev babel-register
npm install --save-dev babel-preset-env
babel-preset-env依赖包的作用可以参考下这个文档:www.cnblogs.com/ye-hcj/p/70…
4、更改package.json 和 babel
// 测试test目录下,所有的js文件
"scripts": {
"test": "mocha -r babel-register ./test/*.js"
}
// 测试test目录下,所有的带test的js文件
"scripts": {
"test": "mocha -r babel-register ./test/*.test.js"
}
.babelrc文件:
{
"presets": [
[
"env"
]
]
}
5、npm run test就可成功执行针对es6的测试案例
TypeScript 测试案例
ts测试用例跟上面写法差不多,在package.json里有区别:
npm install --save-dev typescript
npm install --save-dev ts-node
改一下package.json的script,新加一条"testTs": “mocha -r ts-node/register ./test/*.ts”,当然要想处理typescript需要先安装typescript、ts-node模块。
package.json 为:
"scripts": {
"test": "mocha -r babel-core/register ./test/*.js",
"testTS": "mocha -r ts-node/register ./test/*.ts"
},
执行npm run testTS