チャイでassert、expect、shouldの違いは何ですか?


159

違いは何ですかassertexpectそしてshould何を使用するには、とは?

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

var foo = 'bar';

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

foo.should.equal('bar');

回答:


288

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

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

  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はtrueでなければなりません」というメッセージが出力されます。shouldインターフェースでカスタムメッセージを設定する機会はありません。

(過去のメモ:この回答では長い間、でカスタムメッセージを取得expectするには回避策を使用する必要があると述べていました。AurélienRibonは、メッセージをexpect2番目のパラメータとして渡すと機能することを通知しました。そのため、このメッセージのサポートを提供し始めたMochaのバージョンを見つけることができず、それを文書化したドキュメントのバージョンを初めて見つけることもできませんでした。)

と、カスタムメッセージを使用しない場合、すべてが次を出力することassert.isTrue(foo)に注意してください。expect(foo).to.be.truefoo.should.be.truefoo === 1

    AssertionError: expected 1 to be true

したがって、expectおよびshouldインターフェースの方が読みやすいですが、アサーションが失敗した場合、一方のインターフェースが他方よりも自然に情報を提供するようにはなりません。このメッセージは、3つのインターフェースすべてで同一であり、正確に何をテストしていたはわかりません。得られた値1が必要だったということだけがわかりtrueます。テストの対象を知りたい場合は、メッセージを追加する必要があります。


8
次のことも実行できることに注意してくださいexpect(foo).to.equal(true, "foo should be true");
user5325596

expect最新バージョンのモカを使用して、カスタムメッセージをで表示できません
Mirko

@ミルコモカのバージョンはここで重要なものではありません。最新のチャイを使用していますか?
ルイ

バニラエクスプレス(4.16.3)、モカ(5.1.1)、チャイ(4.1.2)、チャイhttp(4.0.0)プロジェクトでも同じです。コマンドmochaを使用して実行し、テストが失敗した場合、カスタムメッセージはどこにも表示されません。
Juha Untinen、

15

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

主張する

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.