简要介绍如何对Node.js的代码进行单元测试
Mocha(发音"摩卡")诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏览器和Node环境都可以使用。所谓"测试框架",就是运行测试的工具。通过它,可以为JavaScript应用添加测试,从而保证代码的质量。
$ npm install --global mocha
Mocha的作用是运行测试脚本,首先必须学会写测试脚本。所谓"测试脚本",就是用来测试源码的脚本。
假设有以下的calc.js
exports.add = function (i, j) {
return i + j;
};
exports.mul = function (i, j) {
return i * j;
};
要测试这个加法模块是否正确,就要写测试脚本。
通常测试脚本的文件名与源码文件名相同,后缀一般为.test.js(表示测试),或者.spec.js(表示规格)。比如calc.js的测试文件命名为calc.test.js,代码如下:
var assert = require('assert');
var calc = require('../calc.js');
describe('Calculator Tests', function () {
describe('Addition Tests', function () {
it('returns 1 + 1 = 2', function (done) {
assert.equal(calc.add(1, 1), 2);
done();
});
it('returns 1 + -1 = 0', function (done) {
assert.equal(calc.add(1, -1), 0);
done();
});
});
describe('Multiplication Tests', function () {
it('returns 2 * 2 = 4', function (done) {
assert.equal(calc.mul(2, 2), 4);
done();
});
it('returns 0 * 4 = 4', function (done) {
assert.equal(calc.mul(0, 4), 0);
done();
});
});
});
几点说明:
有了测试脚本以后,就可以用mocha运行它。
$ mocha calc.test.js
Calculator Tests
Addition Tests
√ returns 1 + 1 = 2
√ returns 1 + -1 = 0
Multiplication Tests
√ returns 2 * 2 = 4
√ returns 0 * 4 = 4
4 passing (34ms)
$ mocha
# 运行结果
Calculator Tests
Addition Tests
√ returns 1 + 1 = 2
√ returns 1 + -1 = 0
Multiplication Tests
√ returns 2 * 2 = 4
√ returns 0 * 4 = 4
PlusOne Tests
HandleArr Tests
√ returns 423 + 1 = 424
HandleArr Carry Tests
√ returns 429 + 1 = 430
HandleArr Carry Tests
√ returns 999 + 1 = 1000
7 passing (40ms)
test文件夹下面有两个测试文件,calc.test.js,plusOne.test.js
$ mocha -t 5000 --recursive --reporter spec
// promise.test.js
it('异步请求应该返回一个对象', function() {
return fetch('https://api.github.com')
.then(function(res) {
return res.json();
}).then(function(json) {
expect(json).to.be.an('object');
});});
mocha在describe块之中,提供测试用例的四个钩子:before()、after()、beforeEach()和afterEach()。它们会在指定时间执行。
describe('hooks', function() {
before(function() {
// 在本区块的所有测试用例之前执行
});
after(function() {
// 在本区块的所有测试用例之后执行
});
beforeEach(function() {
// 在本区块的每个测试用例之前执行
});
afterEach(function() {
// 在本区块的每个测试用例之后执行
});
// test cases
});