なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

jest で配列の要素の順番に関係なく比較を行いたい

例えば、下のようなコードが合った場合、 jest の toEqual を使うと、確率で落ちます。

const arr = [];

const mockDbInsert = (elem: number) => {
  return new Resolve((resolve) => {
    setTimeout(() => {
      arr.push(elem);
    }, Math.random() * 10);
  });
};

const getAllRecords = () => arr;

beforeEach(async () => {
  await Promise.all([mockDbInsert(1), mockDbInsert(2), mockDbInsert(3)]);
});

it("two array elements are equals", () => {
  expect(getAllRecords()).toEqual([1, 2, 3]);
});

確率で落ちるテストは開発の治安が悪くなってしまうので、なんとかしましょう!ということで、上のようなものを解決する方法です。
やり方は、 jest-extended を導入して、マッチャーを変更するだけで出来ます。

$ yarn add jest-extended --dev

した後、使用するマッチャーを toEqual から、 toIncludeSameMembers に変えるだけ。

it("two array elements are equals", () => {
  expect(getAllRecords()).toIncludeSameMembers([1, 2, 3]);
});

これで、順番がランダムに帰ってきたとしても、含まれている要素が一致していれば、テストが通るようになります。
おしまい。