单元测试对于及早发现代码问题、定位问题,有其它测试不可替代的作用。做好单元测试在代码的可维护性、代码重构及后期功能扩展方面,都有极重要的意义。对于Node.js来说,有很多第三方自动化测试模块,如:mocha。本文主要介绍,Node.js提供的编写单元测试用例的模块,assert断言模块。使用断言模块require('assert')
引用即可。
- 抛出断言导常:assert.fail(actual, expected, message, operator)
- 检测结果是否为真:assert(value[, message]), assert.ok(value[, message])
- 相等和不相等判断:assert.equal(actual, expected[, message])、assert.notEqual(actual, expected[, message])
- 严格相等和不相等判断:assert.strictEqual(actual, expected[, message])、assert.notStrictEqual(actual, expected[, message])
- 深度匹配和不匹配判断:assert.deepEqual(actual, expected[, message])、assert.notDeepEqual(actual, expected[, message])
- 声明模块抛出和不抛出异常:assert.throws(block[, error][, message])、assert.doesNotThrow(block[, message])
- 判断是否为假:assert.ifError(value)
1. 抛出断言导常:assert.fail(actual, expected, message, operator)
assert.fail(value)
方法用于抛出断言异常。当有异常信息message
时将显示异常信息,没有时将显示用例的实际值actual
和期望值expected
通过分隔符operator
分隔。
assert.fail(1, 2, '1应该小于2', '<'); //AssertionError: 1应该小于2 assert.fail(1, 2, '', '<'); //AssertionError: 1 < 2
2. 检测结果是否为真:assert(value[, message]), assert.ok(value[, message])
assert(value[, message])或assert.ok(value[, message])
方法用于检测结果是否为真,不为真时将抛出异常。本站在判断ORM中对象必填项是否填入时使用了此方法,示例如下:
//文章标题和简介必填 assert.ok(article.title && article.summary, "Need a title and a summary");
3. 相等和不相等判断:assert.equal(actual, expected[, message])、assert.notEqual(actual, expected[, message])
assert.equal(actual, expected[, message])
方法用于判断实际值actual
和期望值expected
是否相等,判断方式相当于使用"=="
。assert.notEqual(actual, expected[, message])
方法则用于判断是否不相等。
assert.equal(1>2, true, '1应该小于2'); //AssertionError: 1应该小于2 assert.notEqual(1>2, false, '1应该小于2'); //AssertionError: 1应该小于2
4. 严格相等和不相等判断:assert.strictEqual(actual, expected[, message])、assert.notStrictEqual(actual, expected[, message])
assert.strictEqual(actual, expected[, message])
方法用于判断实际值actual
和期望值expected
是否严格相等,判断方式相当于使用"==="
。assert.notStrictEqual(actual, expected[, message])
方法则用于判断是否严格不相等。
assert.strictEqual(1, '1', '1和"1"不一样'); //1和"1"不一样 assert.notStrictEqual(1, 1, '1和1一样'); //1和1一样
5. 深度匹配和不匹配判断:assert.deepEqual(actual, expected[, message])、assert.notDeepEqual(actual, expected[, message])
assert.deepEqual(actual, expected[, message])
方法用于判断实际值actual
和期望值expected
是否深度匹配,其判断方式首先会使用"==="
进行匹配,还会判断是否为同一个Buffer
,是否为相同的Date
类型,是否为相同的RegExp
类型。assert.notDeepEqual(actual, expected[, message])
方法则判断方式相同结果相反。
var buf1 = new Buffer('abc'); var buf2 = new Buffer('abc'); assert.strictEqual(buf1, buf2, 'buf1和buf2不一样'); //AssertionError: buf1和buf2不一样 assert.notDeepEqual(buf1, buf2, 'buf1和buf2一样'); //AssertionError: buf1和buf2一样
6. 声明模块抛出和不抛出异常:assert.throws(block[, error][, message])、assert.doesNotThrow(block[, message])
assert.throws(block[, error][, message])
方法使声明的block
模块抛出异常。error
可以是构造函数,验证函数或者正则表达式assert.doesNotThrow(block[, message])
方法判断方式相反。
//用构造函数验证实例 assert.throws( function() { throw new Error("Wrong value"); }, Error ); //用正则表达式验证 assert.throws( function() { throw new Error("Wrong value"); }, /value/ ); //自定义错误校验 assert.throws( function() { throw new Error("Wrong value"); }, function(err) { if ( (err instanceof Error) && /value/.test(err) ) { return true; } }, "unexpected error" );
7. 判断是否为假:assert.ifError(value)
assert.ifError(value)
方法用于断言value
是否为false
,false
时不抛出异常,true
时抛出异常。
assert.ifError(1>2); //无异常抛出 assert.ifError(1<2); //抛出异常