断言风格

本指南的这一部分将介绍您在测试环境中可能使用的三种不同的断言风格。做出选择后,建议您查看所选风格的 API 文档。

断言

查看完整的断言 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 API

BDD 风格有两种形式:expectshould。两者都使用相同的链式语言来构建断言,但它们在最初构建断言的方式上有所不同。在 should 的情况下,还有一些注意事项和额外的工具来克服这些注意事项。

预期

BDD 风格通过 expectshould 接口公开。在这两种情况下,您都将自然语言断言链接在一起。

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 不是一个有效的语句,因为 undefinednull 尚未扩展为具有 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