web-dev-qa-db-ja.com

Chaiのassert、expect、shouldの違いは何ですか?

assertexpect、およびshouldの違いは何ですか?また、何を使用するのですか?

assert.equal(3, '3', '== coerces values to strings');

var foo = 'bar';

expect(foo).to.equal('bar');

foo.should.equal('bar');
142
Manu

違いは そこに文書化されています です。

3つのインターフェースは、アサーションの実行スタイルが異なります。最終的に、彼らは同じタスクを実行します。あるスタイルを他のスタイルよりも好むユーザーもいます。とはいえ、強調するに値する技術的な考慮事項もいくつかあります。

  1. Assertおよびexpectインターフェイスは、Object.prototypeを変更しませんが、変更する必要があります。したがって、Object.prototypeを変更できない、または変更したくない環境では、これらはより良い選択です。

  2. 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を望んでいました。テスト対象を知りたい場合は、メッセージを追加する必要があります。

271
Louis

この簡単な例で違いが明確になることを願っています

アサート

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を除くすべての最新ブラウザーで動作します。