🐷

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