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/来查看