アサーションスタイル

このガイドのセクションでは、テスト環境で使用できる3つの異なるアサーションスタイルを紹介します。選択したら、選択したスタイルのAPIドキュメントを参照することをお勧めします。

Assert

Assert APIの全文を参照

assertスタイルはassertインターフェースを介して公開されます。これは、node.jsにパッケージ化されているものと同様の、古典的なassertドット表記を提供します。ただし、このassertモジュールは、いくつかの追加テストを提供し、ブラウザと互換性があります。

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スタイルでは、assertステートメントの最後のパラメーターとして、オプションのメッセージを含めることができます。アサーションが失敗した場合、これらはエラーメッセージに含まれます。

BDD

BDD APIの全文を参照

BDDスタイルには、expectshouldの2つの種類があります。どちらも同じチェーン可能な言語を使用してアサーションを構築しますが、アサーションの初期構築方法が異なります。shouldの場合、いくつかの注意点と、それらの問題を克服するための追加ツールもあります。

Expect

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

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のrequireはexpect関数の参照に過ぎないのに対し、shouldのrequireでは関数が実行されていることに注意してください。

var chai = require('chai')
  , expect = chai.expect
  , should = chai.should();

expectインターフェースは、言語アサーションのチェーンの開始点として関数を提供します。Node.jsとすべてのブラウザで動作します。

shouldインターフェースはObject.prototypeを拡張して、言語アサーションの開始点として単一のゲッターを提供します。Node.jsとInternet Explorer以外のすべての最新のブラウザで動作します。

Should 追加機能

shouldObject.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を変数に代入した場合、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フラグをスローされたAssertionErrorsに含めるかどうかを制御します。falseは常にfalseになります。trueは、アサーションでdiffの表示が要求されている場合にtrueになります。

chai.config.showDiff = false; // turn off reporter diff display

config.truncateThreshold

  • @param {Number}
  • @default 40

ユーザー設定可能なプロパティで、アサーションエラーにおける実際の値と期待値の長さのしきい値を設定します。このしきい値を超えると、値は切り捨てられます。

切り捨てを完全に無効にする場合は、0に設定します。

chai.config.truncateThreshold = 0; // disable truncating