should是一个与测试框架无关的、表现力强且易读、BDD风格的断言库。与Node.js的assert模块相比,它的表达性更强更有用,让你的测试代码更简单、错误帮助信息更有用。
1. 模块介绍与安装
should模块可以通过npm命令安装,并通过--save-dev参数将依赖关系保持到package.json文件的devDependencies节点中:
npm install should --save-dev
模块安装后,通过require('should')方法引用should后,它会扩展一个Object.prototype不可枚举的访问器,然后你所使用的对象就具有了should的一些形为。
var should = require('should');
(5).should.be.exactly(5).and.be.a.Number();
也可以不通过访问器的形式使用should.js,通过require('should/as-function')的方式引用,并通过引用变量即可进行访问:
var should = require('should/as-function');
should(10).be.exactly(5).and.be.a.Number();
2. 使用示例
require('should')引用should.js后,测试对象中会被添加should属性并据有其表现形为,这样的我们就可以通过其should属性来进行相关断言。或者,也可以通过其引用变量来进行测试断言。根据对象创建形式的不同,可以通过以下两种方式进行should断言:
var should = require('should');
var user = {
name: 'tj'
, pets: ['tobi', 'loki', 'jane', 'bandit']
};
user.should.have.property('name', 'tj');
user.should.have.property('pets').with.lengthOf(4);
// 如果对象是通过 Object.create(null) 创建
// 那么它不会继承 `Object.prototype` 所以它也不会据有 `.should` 访问器属性
// 这时,我们应该使用以下方式进行断言:
should(user).have.property('name', 'tj');
// 可以 should(null).not.be.ok(); 进行空值测试
someAsyncTask(foo, function(err, result){
should.not.exist(err);
should.exist(result);
result.bar.should.equal(foo);
});
链式断言
require()调用后相关对象中会有should.js中的属性,这些属性可以链式的调用。你可以断言中按需要使用.an/.of/.a/.and/.be/.have/.with/.is/.which等方法。如:
user.should.be.an.instanceOf(Object).and.have.property('name', 'tj');
user.pets.should.be.instanceof(Array).and.have.lengthOf(4);
should.js完整的API文档,可以通过http://shouldjs.github.io/来查看
