179

assertexpect、 とはどう違いshouldますか? いつ何を使う?

assert.equal(3, '3', '== coerces values to strings');
    
var foo = 'bar';
    
expect(foo).to.equal('bar');
    
foo.should.equal('bar');
4

3 に答える 3

301

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

3 つのインターフェイスは、アサーションを実行するさまざまなスタイルを示します。最終的に、それらは同じタスクを実行します。一部のユーザーは、あるスタイルを他のスタイルよりも好みます。そうは言っても、強調する価値のある技術的な考慮事項がいくつかあります。

  1. およびインターフェイスは を変更しませんが、変更assertします。そのため、変更できない、または変更したくない環境では、より良い選択です。expectObject.prototypeshouldObject.prototype

  2. assertおよびインターフェイスは、expectほぼすべての場所でカスタム メッセージをサポートします。例えば:

     assert.isTrue(foo, "foo should be true");
     expect(foo, "foo should be true").to.be.true;
    

アサーションが失敗すると、失敗したアサーションとともに「foo should be true」というメッセージが出力されます。インターフェイスでカスタム メッセージを設定する機会はありませんshould

(歴史的なメモ: 長い間、この回答では、でカスタム メッセージを取得するexpectには、回避策を使用する必要があると述べられていました。Aurélien Ribonexpectは、2 番目のパラメーターとして にメッセージを渡すと機能することを知らせてくれました。したがって、どのバージョンの Mocha がこのメッセージのサポートを提供し始めたのか、またどのバージョンのドキュメントでこのメッセージが初めて文書化されたのかを見つけることができませんでした。)

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

    AssertionError: expected 1 to be true

そのためexpectshouldインターフェイスは読みやすくなっていますが、アサーションが失敗したときに、あるインターフェイスが他のインターフェイスよりも自然に有益であるとは限りません。このメッセージは、3 つのインターフェイスすべてで同じですが、正確にをテストしていたのかを示すものではなく、得られた値が必要だったということだけを示して1いますtrue。何をテストしていたのか知​​りたい場合は、メッセージを追加する必要があります。

于 2014-01-28T12:01:03.323 に答える