'.toMatchObject' と 'objectContaining' の違いは何ですか? 質問する

'.toMatchObject' と 'objectContaining' の違いは何ですか? 質問する

次のテストを書きました:

it('Can decrement the current step', function () {
    expect(reducer(TestState, { type: 'GOTO_PREVIOUS_STEP' })).toMatchObject({ currentStep: 4 });
});

it('Can decrement the current step v2', function () {
    expect(reducer(TestState, { type: 'GOTO_PREVIOUS_STEP' })).toEqual(expect.objectContaining({ currentStep: 4 }));
});

どちらもテストに合格しているようですが、両者の間に違いはありますか? 両者の間にパフォーマンスへの影響はありますか?

ベストアンサー1

ドキュメントを見て、それを確認するために自分で実験したところ、違いは、期待値として渡されたプロパティ内にネストされたオブジェクトの処理にあります。

期待オブジェクトに、オブジェクトを含むプロパティがある場合、そのオブジェクトには全てではないがいくつか実際のオブジェクトの同等のプロパティのプロパティの場合、次のようになります。

  • .toMatchObject()それでも通過するだろう、ドキュメントに記載されている通り

  • expect.objectContaining()失敗します(期待オブジェクト自体でそのプロパティを宣言しない限りexpect.objectContaining()

例 (Jest でテスト済み):

  // objectContaining, with nested object, containing full props/values
  // PASSES
  expect({ position: { x: 0, y: 0 } }).toEqual(expect.objectContaining({
    position: {
      x: expect.any(Number),
      y: expect.any(Number)
    }
  }));

  // objectContaining, with nested object, containing partial props/values
  // FAILS
  expect({ position: { x: 0, y: 0 } }).toEqual(expect.objectContaining({
    position: {
      x: expect.any(Number)
    }
  }));

  // objectContaining, with nested object, also declared with objectContaining, containing partial props/values
  // PASSES
  expect({ position: { x: 0, y: 0 } }).toEqual(expect.objectContaining({
    position: expect.objectContaining({
      x: expect.any(Number)
    })
  }));

  // toMatchObject, with nested object, containing full props/values
  // PASSES
  expect({ position: { x: 0, y: 0 } }).toMatchObject({
    position: {
      x: expect.any(Number),
      y: expect.any(Number)
    }
  });

  // toMatchObject, with nested object, containing partial props/values
  // PASSES
  expect({ position: { x: 0, y: 0 } }).toMatchObject({
    position: {
      x: expect.any(Number)
    }
  });

おすすめ記事