🐷

chaiのeqとeqlとeqlsとequalとequalsの違い

2022/08/10に公開

わかりにくすぎる

chaiのアサーションには、以下の5つがあります。

  • eq
  • eql
  • eqls
  • equal
  • equals

わかりにくすぎるので整理します。

equaleqlだけ覚えれば不便はしない

equalの比較に使います。===だと思っておけばいいです。

eqlオブジェクトの比較に使います。厳密なロジックは以下のページにあります。

https://github.com/chaijs/deep-eql

コードで挙動を確認

const primitiveA = 'foo';
const primitiveB = 'foo';

// 値の比較はequal
expect(primitiveA).to.equal(primitiveB);

const objectA = ['foo', 'bar'];
const objectB = ['foo', 'bar'];

// オブジェクトは構造が同じでも別の実体のため等しくない
expect(objectA).to.not.equal(objectB);

// eqlを使えばオブジェクトが同じ構造か判定できる
expect(objectA).to.eql(objectB);

equaleqequalsは同じ

値比較はeqequalsequalのエイリアスになっています。

eqleqlsは同じ

オブジェクト比較はeqlseqlのエイリアスになっています。

.deep.equal.eqlの違い

.deepが付くと、同一チェーン内がぜんぶ.deep扱いになります。

// .deepが2つ目のeqにも効くのでOK
expect(objectA)
    .to.deep.eq(objectB)
    .eq(['foo', 'bar']);

// 単なるeqの扱いになるのでNG
expect(objectA)
    .to.eql(objectB)
    .eq(['foo', 'bar']);

Discussion