The hidden power of Jest matchers

medium.com

素晴らしい記事。これらの「The hidden power」を知らず、expect(rec.prop).toBe(val)の組み合わせをプロパティの数だけ並べてましたよ。

function fn() {
    return { a: 1, b: true, c: 'hello', d: { d1: 2, d2: false }, e: 3, f: 4 };
}

// 今まで書いてたやり方。検査するプロパティの数だけMatcherを並べる。
test('an usual power', () => {
    const rec = fn();
    expect(rec.b).toBeTruthy();
    expect(rec.c).toBe('hello');
    expect(rec.d.d2).toBeFalsy();
});

// 上記のテストを、書き換えると以下。
test('The hidden power', () => {
    expect(fn()).toEqual(expect.objectContaining(
        { b: true, c: 'hello', d: { d1: expect.any(Number), d2: false } },
    ));
});

Reducerのテストでは、Stateの持つプロパティ数がとても多く一度に検査したいプロパティもたくさんあるケースがあって、これがとても有用。記事で説明されている、expect.any()とexpect.objectContaining()を組み合わせてオブジェクトの比較がすごく直感的に書けるようになりました。