chai-parentheses

モダンなバンドラーとの互換性に問題がある dirty-chai の API 互換フォークです。

アサーションプロパティを終了するための関数形式。

インストール

npm install chai-parentheses --save-dev

使用方法

chai-parentheses は chai の プラグインです。

var chai = require('chai');
var parentheses = require('chai-parentheses');
var expect = chai.expect

chai.use(parentheses);
// ...
expect(true).to.be.true();

カスタムエラーメッセージ

この関数形式のプロパティ終了機能により、アサーションが失敗した場合に表示するカスタムエラーメッセージを提供できます。これは、アサーションがチェーンの中間にある場合でも、最後にある場合でも機能します。

expect(true).to.be.true.and.not.false('Reason: Paradox');
expect(true).to.be.true('The fabric of logic has torn').and.not.false();

影響を受けるアサーション

次のビルトインアサーションは、このプラグインによって関数呼び出し形式を使用するように変更されています。

  • ok
  • true
  • false
  • null
  • undefined
  • exist
  • empty
  • arguments
  • Arguments

注意点

常に関数で終了する

これらの形式を混在させることもできますが、チェーンは常に関数形式で終了する必要があります。そうでないと、チェーン内のそれまでのアサーションは実行されません。

expect(true).to.be.true.and.not.false();
expect(true).to.be.true().and.not.false();

チェーンの長さ/引数

これは、他のアサーションの後続のチェーンにあるlengthargumentsのアサーションの両方を壊します。この制限を回避するには、チェーンで最初にlengthまたはargumentsのアサーションを実行するか、複数のアサーションステートメントを実行します。

myArray.should.exist.and.should.have.length(3); // Error: length is not a function

// Do two assert statements instead
myArray.should.exist();
myArray.should.have.length(3);

chai-as-promised との併用

chai-as-promised を使用している場合は、chai-parentheses の前に .use で chai-as-promised を使用する必要があります。

var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
var parentheses = require("chai-parentheses");


chai.use(chaiAsPromised);
chai.use(parentheses);

プラグインアサーション

このプラグインは、他の Chai プラグインによって追加されたプロパティアサーションもフックして変換します。必要なのは、他のプラグインがロードされる前に chai-parentheses をロードして、フックを配置することだけです。

たとえば、sinon-chai を chai-parentheses の後にロードすると、そのすべてプロパティアサーションがメソッドアサーションになります。

spy.should.have.been.called();
spy.should.have.been.calledOnce();
spy.should.have.been.calledTwice();

理由

Chai はおそらく Node.js で最も人気のあるアサーションライブラリの1つです。400以上の依存関係があり、月間約50万回ダウンロードされています。

スタイル上の理由から、Chai はパラメーターを必要としないアサーションは、プロパティアクセスでアサーションを行うように設計されました。これにより、これらのアサーションがメソッドである場合に必要な空の括弧を省略できました。

この設計上の決定は、特にTDDの赤-緑-リファクタリングの流れを厳密に守らない場合、テストにどの程度の信頼を置くことができるかに大きな影響を与えます。その理由の詳細については、Beware of libraries that assert on property access を読んでください。

JSHintなどのリンターからエラーが発生するという問題もあります。テストコードをリンティングしている場合、リンターは「代入または関数呼び出しを期待しましたが、式が見つかりました」のようなエラーで警告を出します。リンターはプロパティゲッターについて知らないため、この行には副作用がないと仮定し、間違いがあった場合に警告を出します。

これらのエラーを抑制するのは良い解決策ではありません。テストコードは、本番コードと同様に、あるいはそれ以上に重要になりつつあります。静的解析を使用してテストの構文エラーをキャッチすることは、テストが明確に定義され、タイプミスがないことを確認するための優れたツールです。

このプラグインは、Chai で記述/使用されている多くのプロジェクトやプラグインのエコシステムを依然として活用しながら、テストを信頼できるようにするために記述されました。ビルトインのプロパティアサーションと、プラグインによって追加されたプロパティアサーションをメソッドアサーションに変換します。

影響を受けるアサーションのリスト、およびプラグインによって追加された多くのアサーションは、アクセス時にすぐにアサーションを行うプロパティゲッターです。そのため、プロパティアクセスでアサーションチェーンを終了して使用されるように記述されていました。

expect(true).to.be.true;
foo.should.be.ok;

より良い選択肢は、コードの意図をより明確にし、リンターが何かが間違っているという警告を止めるために、これらのアサーションに関数呼び出し形式を提供することでした。この形式は既存のプロパティアクセス形式に追加され、既存のテストコードには影響しません。

expect(true).to.be.true();
foo.should.be.ok();