回答:
違いはそこに文書化されています。
3つのインターフェースは、アサーションを実行する異なるスタイルを提供します。最終的に、彼らは同じタスクを実行します。一部のユーザーは、他よりも1つのスタイルを好みます。とはいえ、強調する価値のある技術的な考慮事項もいくつかあります。
assertとexpectインターフェースは変更しませんが、変更するObject.prototype
必要があります。したがって、変更できない、または変更したくない環境では、これらのオプションが適していますObject.prototype
。
assertおよびexpectインターフェースは、ほぼどこでもカスタムメッセージをサポートします。例えば:
assert.isTrue(foo, "foo should be true");
expect(foo, "foo should be true").to.be.true;
アサーションが失敗した場合、失敗したアサーションとともに「fooはtrueでなければなりません」というメッセージが出力されます。shouldインターフェースでカスタムメッセージを設定する機会はありません。
(過去のメモ:この回答では長い間、でカスタムメッセージを取得expect
するには回避策を使用する必要があると述べていました。AurélienRibonは、メッセージをexpect
2番目のパラメータとして渡すと機能することを通知しました。そのため、このメッセージのサポートを提供し始めたMochaのバージョンを見つけることができず、それを文書化したドキュメントのバージョンを初めて見つけることもできませんでした。)
と、カスタムメッセージを使用しない場合、すべてが次を出力することassert.isTrue(foo)
に注意してください。expect(foo).to.be.true
foo.should.be.true
foo === 1
AssertionError: expected 1 to be true
したがって、expectおよびshouldインターフェースの方が読みやすいですが、アサーションが失敗した場合、一方のインターフェースが他方よりも自然に情報を提供するようにはなりません。このメッセージは、3つのインターフェースすべてで同一であり、正確に何をテストしていたかはわかりません。得られた値1
が必要だったということだけがわかりtrue
ます。テストの対象を知りたい場合は、メッセージを追加する必要があります。
expect
最新バージョンのモカを使用して、カスタムメッセージをで表示できません
mocha
を使用して実行し、テストが失敗した場合、カスタムメッセージはどこにも表示されません。
この簡単な例でそれらの違いが明確になることを願っています
主張する
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ステートメントに含めることができます。これらは、アサーションに合格しない場合のエラーメッセージに含まれます。
チェーン可能言語を使用してアサーションを構築することを期待し、すべきであることに注意してください。ただし、アサーションが最初に構築される方法が異なります。万一の場合には、いくつかの警告と、この警告を克服するための追加のツールもあります。
期待する
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とshouldの違い
最初に、expect requireは単なるexpect関数への参照であるのに対し、should requireでは関数が実行されていることに注意してください。
var chai = require('chai')
, expect = chai.expect
, should = chai.should();
期待インターフェースはあなたの言語のアサーションを連鎖するための出発点としての機能を提供します。node.jsとすべてのブラウザーで動作します。
なければならないのインターフェース言語のアサーションのための開始点として単一のゲッターを提供するのObject.prototypeを拡張します。これは、node.jsおよびInternet Explorerを除くすべての最新ブラウザーで動作します。
expect(foo).to.equal(true, "foo should be true");