web-dev-qa-db-ja.com

チャイではexpect()。to.be.trueはどのように機能しますか?

expect(true).to.be.true;

このコードでは、すべての「to」、「be」、「true」は「expect(true)」からのオブジェクト応答の属性のようです。

例外を発生させるために、これらの属性はどのように機能しますか?

22
wangzi6147

ソースコードを確認できます:

_[ 'to', 'be', 'been'
  , 'is', 'and', 'has', 'have'
  , 'with', 'that', 'which', 'at'
  , 'of', 'same', 'but', 'does' ].forEach(function (chain) {
    Assertion.addProperty(chain);
});
_

addPropertyにはutilsがあります:
https://github.com/chaijs/chai/blob/master/lib/chai/utils/addProperty.js

これにより、次のようにプロパティを無限にチェーンできます:.to.be.to.to.to.be.equal()

より簡単なデモを作成しましょう:

.true()メソッドを持つassertオブジェクトがあると仮定します

_const assert = {
  'true': function (v) {
    return !!v
  }
}
_

そして、あなたは_.to_を無限に連鎖できるようにしたい。単にdefinePropertyを使用してゲッターを定義します。

_Object.defineProperty(assert, 'to', {
  get() {
    return assert
  }
})
_

だから今できる

_assert.to.to.to.to.true(false)
_

作業コード: https://codepen.io/CodinCat/pen/LLzBEX?editors=0012


ここに別のより複雑な例を追加しました: https://codepen.io/CodinCat/pen/dRVjXL?editors=0012

この例では、_.true_プロパティにいくつかの動作があることがわかります。

expect()の値を内部___expectObj_および___value_プロパティに保存し、_.true_のゲッターで値を確認します。だからあなたはできる

_expect(false).to.to.to.to.true
_
22
CodinCat

chai Assertion のソースを見てください。しかし、tl; drは、Chaiがアサートライブラリに独自のチェーン可能なメソッドを実装していることです。ただし、以下のコードに示すように、特別なキーワードは単なる構文上の砂糖です。文字通り、それらは単に追加され、連鎖できるプロパティにすぎませんが、実際には何も定義されていません:

  /**
   * ### Language Chains
   *
   * The following are provided as chainable getters to improve the readability
   * of your assertions.
   *
   * **Chains**
   *
   * - to
   * - be
   * - been
   * - is
   * - that
   * - which
   * - and
   * - has
   * - have
   * - with
   * - at
   * - of
   * - same
   * - but
   * - does
   *
   * @name language chains
   * @namespace BDD
   * @api public
   */

  [ 'to', 'be', 'been'
  , 'is', 'and', 'has', 'have'
  , 'with', 'that', 'which', 'at'
  , 'of', 'same', 'but', 'does' ].forEach(function (chain) {
    Assertion.addProperty(chain);
  });

そこから実際に検索するのは、具体的に定義するキーワードです。たとえば、キーワード.to.be.true次のコードスニペットで true定義どおり を確認します

  /**
   * ### .true
   *
   * Asserts that the target is strictly (`===`) equal to `true`.
   *
   *     expect(true).to.be.true;
   *
   * Add `.not` earlier in the chain to negate `.true`. However, it's often best
   * to assert that the target is equal to its expected value, rather than not
   * equal to `true`.
   *
   *     expect(false).to.be.false; // Recommended
   *     expect(false).to.not.be.true; // Not recommended
   *
   *     expect(1).to.equal(1); // Recommended
   *     expect(1).to.not.be.true; // Not recommended
   *
   * A custom error message can be given as the second argument to `expect`.
   *
   *     expect(false, 'nooo why fail??').to.be.true;
   *
   * @name true
   * @namespace BDD
   * @api public
   */

  Assertion.addProperty('true', function () {
    this.assert(
        true === flag(this, 'object')
      , 'expected #{this} to be true'
      , 'expected #{this} to be false'
      , flag(this, 'negate') ? false : true
    );
  });
7
aug