assert
、expect
、およびshould
の違いは何ですか?また、何を使用するのですか?
assert.equal(3, '3', '== coerces values to strings');
var foo = 'bar';
expect(foo).to.equal('bar');
foo.should.equal('bar');
違いは そこに文書化されています です。
3つのインターフェースは、アサーションの実行スタイルが異なります。最終的に、彼らは同じタスクを実行します。あるスタイルを他のスタイルよりも好むユーザーもいます。とはいえ、強調するに値する技術的な考慮事項もいくつかあります。
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 should 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インターフェースはreadの方が優れていますが、アサーションが失敗した場合、一方のインターフェースが他方のインターフェースよりも自然に有益であるというわけではありません。このメッセージは、3つすべてのインターフェイスで同一であり、whatを正確にテストしていたのではなく、取得した値が1
しかし、あなたはtrue
を望んでいました。テスト対象を知りたい場合は、メッセージを追加する必要があります。
この簡単な例で違いが明確になることを願っています
アサート
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ステートメントの最後のパラメーターとして含めることができます。アサーションがパスしない場合、これらはエラーメッセージに含まれます。
注は、アサーションを構築するためにチェーン可能な言語を使用する必要がありますが、アサーションが最初に構築される方法が異なります。 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とshouldの違い
まず、require requireはexpect関数への単なる参照であることに注意してください。一方、should requireでは、関数が実行されています。
var chai = require('chai')
, expect = chai.expect
, should = chai.should();
expectインターフェイスは、言語アサーションを連鎖するための開始点として機能を提供します。 node.jsおよびすべてのブラウザーで動作します。
shouldインターフェースはObject.prototypeを拡張して、言語アサーションの開始点として単一のゲッターを提供します。 node.jsおよびInternet Explorerを除くすべての最新ブラウザーで動作します。