例えば、下のようなコードが合った場合、 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]); });
これで、順番がランダムに帰ってきたとしても、含まれている要素が一致していれば、テストが通るようになります。
おしまい。