アサーションスタイル
このガイドのセクションでは、テスト環境で使用できる3つの異なるアサーションスタイルを紹介します。選択したら、選択したスタイルのAPIドキュメントを参照することをお勧めします。
Assert
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スタイルには、expect
とshould
の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 追加機能
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
を変数に代入した場合、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