web-dev-qa-db-ja.com

jest.jsの要素の位置を無視する配列等式一致関数はありますか?

.toEqual()はプレーンオブジェクトのすべてのフィールドの等価性をチェックします。

expect(
    {"key1":"pink  wool","key2":"diorite"}
).toEqual(
    {"key2":"diorite","key1":"pink wool"}
);

これは合格です。

ただし、配列については同じではありません。

expect(["pink wool", "diorite"]).toEqual(["diorite", "pink wool"]);

Jestのドキュメントではこれを行うマッチャー関数はないようです。つまり、要素の位置に関係なく2つの配列の等価性をテストします。ある配列の各要素を、他の配列のすべての要素に対してテストする必要がありますか?それとも別の方法がありますか?

27

順序を比較せずに配列を比較する組み込みメソッドはありませんが、比較を行う前に .sort() を使用して単純に配列をソートできます。

expect(["ping wool", "diorite"].sort()).toEqual(["diorite", "pink wool"].sort());`

this fiddle で例を確認できます。

31
biphobe

要素をセットに入れます。ジェストはこれらを一致させる方法を知っています。

expect(new Set(["pink wool", "diorite"])).toEqual(new Set(["diorite", "pink wool"]));
15
0xcaff

use expect.arrayContaining()https://jestjs.io/docs/en/expect#expectarraytainingarray

例えば。、

expect(["ping wool", "diorite"])
  .toEqual(expect.arrayContaining(["diorite", "pink wool"]));
5
Ulad Kasach

既に述べたようにexpect.arrayContainingは、actual配列にexpected配列がサブセットとして含まれているかどうかを確認します。同等性を確認するには

  • どちらも、両方の配列の長さが同じであると断言します(ただし、有用な失敗メッセージは表示されません)
  • または、逆のアサート:expected配列にactual配列が含まれていること:
// This is TypeScript, but remove the types and you get JavaScript
const expectArrayEquivalence = <T>(actual:T[], expected: T[]) => {
  expect(actual).toEqual(expect.arrayContaining(expected));
  expect(expected).toEqual(expect.arrayContaining(actual));
};

これには、最初のアサーションでテストが失敗したときに、actualにない要素のみが認識され、expectedにない余分な要素は認識されないという問題が依然としてあります。

2
nitzel