断言风格
本指南的这一部分将介绍您在测试环境中可能使用的三种不同的断言风格。做出选择后,建议您查看所选风格的 API 文档。
断言
断言风格通过 assert
接口公开。这提供了经典的断言-点符号,类似于与 node.js 捆绑在一起的断言模块。但是,此断言模块提供了几个额外的测试,并且与浏览器兼容。
var assert = require('chai').assert
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
assert.typeOf(foo, 'string'); // without optional message
assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
assert.equal(foo, 'bar', 'foo equal `bar`');
assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');
在所有情况下,断言风格允许您在 assert
语句中将可选消息作为最后一个参数包含。如果您的断言未通过,这些消息将包含在错误消息中。
BDD
BDD 风格有两种形式:expect
和 should
。两者都使用相同的链式语言来构建断言,但它们在最初构建断言的方式上有所不同。在 should
的情况下,还有一些注意事项和额外的工具来克服这些注意事项。
预期
BDD 风格通过 expect
或 should
接口公开。在这两种情况下,您都将自然语言断言链接在一起。
var expect = require('chai').expect
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
expect(beverages).to.have.property('tea').with.lengthOf(3);
Expect 还允许您包含任意消息,以预先添加到可能发生的任何失败断言中。
var answer = 43;
// AssertionError: expected 43 to equal 42.
expect(answer).to.equal(42);
// AssertionError: topic [answer]: expected 43 to equal 42.
expect(answer, 'topic [answer]').to.equal(42);
这在与布尔值或数字等非描述性主题一起使用时非常有用。
应该
should
风格允许与 expect
接口相同的链式断言,但它将每个对象扩展了一个 should
属性来开始您的链。此风格在与 Internet Explorer 一起使用时存在一些问题,因此请注意浏览器兼容性。
var should = require('chai').should() //actually call the function
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
beverages.should.have.property('tea').with.lengthOf(3);
差异
首先,请注意 expect
要求只是一个对 expect
函数的引用,而对于 should
要求,该函数正在执行。
var chai = require('chai')
, expect = chai.expect
, should = chai.should();
expect
接口提供一个函数作为链接语言断言的起点。它在 node.js 和所有浏览器上都有效。
should
接口扩展了 Object.prototype
,以提供一个单一的 getter 作为链接语言断言的起点。它在 node.js 和除 Internet Explorer 之外的所有现代浏览器上都有效。
应该额外
鉴于 should
通过扩展 Object.prototype
工作,在某些情况下 should
将不起作用。主要是,如果您尝试检查对象的存在。请查看以下伪代码
db.get(1234, function (err, doc) {
// we expect error to not exist
// we expect doc to exist and be an object
});
鉴于 err
应该为 null 或 undefined,err.should.not.exist
不是一个有效的语句,因为 undefined
和 null
尚未扩展为具有 should
链启动器。因此,此场景的适当断言如下
var should = require('chai').should();
db.get(1234, function (err, doc) {
should.not.exist(err);
should.exist(doc);
doc.should.be.an('object');
});
如果您将 should
分配给一个 var,您就可以访问几个快速助手,以帮助您在使用 should
时避免麻烦。
should.exist
should.not.exist
should.equal
should.not.equal
should.Throw
should.not.Throw
在 ES2015 中使用 Should
无法从 ES2015 import
语句链式调用函数 - 它必须放在单独的行上,这看起来有点冗长
import chai from 'chai';
chai.should();
为了更简洁的外观,您可以改为执行此操作
import 'chai/register-should';
配置
config.includeStack
- @param {Boolean}
- @default
false
用户可配置属性,影响是否在断言错误消息中包含堆栈跟踪。默认值为 false
,抑制错误消息中的堆栈跟踪。
chai.config.includeStack = true; // turn on stack trace
config.showDiff
- @param {Boolean}
- @default
true
用户可配置属性,影响是否在抛出的断言错误中包含 showDiff
标志。 false
将始终为 false
; true
当断言要求显示差异时,将为真。
chai.config.showDiff = false; // turn off reporter diff display
config.truncateThreshold
- @param {Number}
- @default
40
用户可配置属性,设置断言错误中实际值和预期值的长度阈值。如果超过此阈值,则截断该值。
如果要完全禁用截断,请将其设置为零。
chai.config.truncateThreshold = 0; // disable truncating