web-dev-qa-db-ja.com

オブジェクトの配列でのJestプロパティマッチャーの使用

Jestの新しい Property Matcher 機能( Jest 23.0. であるため)を使用して、生成されたフィールドを含むオブジェクトの配列で一致させようとしています。手動で照合する場合のように、expect.arrayContainingexpect.objectContainingを使用して、プレーンオブジェクトとマッチャー定義の両方を配置しようとしました。現在、これを行う方法はありますか?

const sportsBallPeople = [
  {
    createdAt: new Date(),
    name: 'That one famous guy from Cleveland'
  },
  {
    createdAt: new Date(),
    name: 'That tall guy'
  }
];
expect(sportsBallPeople).toMatchSnapshot(<something goes here>);
15
giodamelio

バージョン情報

質問で指摘されているように、プロパティマッチャーはJest 23.0.0で導入されました。今日(2018年8月5日)の時点でcreate-react-appでブートストラップされたアプリは、まだ<23です。

[〜#〜] object [〜#〜]

単一のオブジェクトにプロパティマッチャーを使用する例を次に示します。

test('sportsBallPerson', () => {
  expect(sportsBallPeople[0]).toMatchSnapshot({
    createdAt: expect.any(Date)
  })
});

生成されたスナップショット:

exports[`sportsBallPerson 1`] = `
Object {
  "createdAt": Any<Date>,
  "name": "That one famous guy from Cleveland",
}
`;

これは、createdAtを任意の日付に正確に一致させ、名前を「クリーブランドの有名な男」に正確に一致させます。

[〜#〜] array [〜#〜]

プロパティマッチャーを使用してオブジェクトの配列をテストするには、forEachを使用して配列をループし、各オブジェクトを個別にスナップショットテストします。

test('sportsBallPeople', () => {
  sportsBallPeople.forEach((sportsBallPerson) => {
    expect(sportsBallPerson).toMatchSnapshot({
      createdAt: expect.any(Date)
    });
  });
});

生成されたスナップショット:

exports[`sportsBallPeople 1`] = `
Object {
  "createdAt": Any<Date>,
  "name": "That one famous guy from Cleveland",
}
`;

exports[`sportsBallPeople 2`] = `
Object {
  "createdAt": Any<Date>,
  "name": "That tall guy",
}
`;

forEach は、オブジェクトが順番にテストされ、各オブジェクトが上記のように適切にスナップショットテストされるようにします。

追加情報

プロパティマッチャーを使用して配列を直接テストすることは適切に機能せず、予期しない副作用があることに注意してください。

アレイをテストする最初の試みは、次のテストを作成することでした。

test('sportsBallPeople as array', () => {
  expect(sportsBallPeople).toMatchSnapshot([
    { createdAt: expect.any(Date) },
    { createdAt: expect.any(Date) }
  ]);
});

次のスナップショットを生成しました。

exports[`sportsBallPeople as array 1`] = `
Array [
  Object {
    "createdAt": Any<Date>,
  },
  Object {
    "createdAt": Any<Date>,
  },
]
`;

名前のプロパティが欠落しているため、これは正しくありませんが、テストに合格します(Jest v23.4.2)。名前が変更され、追加のプロパティが追加されても、テストは合格です。

さらに興味深いのは、このテストが実行されるとすぐに、プロパティマッチャーを使用する次のテストが悪影響を受けることでした。たとえば、オブジェクトのループテストの前にこのテストを配置すると、これらのスナップショットは次のように変更されました。

exports[`sportsBallPeople 1`] = `
Object {
  "createdAt": Any<Date>,
}
`;

exports[`sportsBallPeople 2`] = `
Object {
  "createdAt": Any<Date>,
}
`;

要約すると、プロパティマッチャーで使用する配列を直接渡すことは機能せず、プロパティマッチャーを使用する他のスナップショットテストに悪影響を及ぼす可能性があります。

15