1. ホーム
  2. javascript

[解決済み] .toMatchObject' と 'objectContaining' の違いは何ですか?

2022-12-17 10:03:46

質問

以下のようなテストを書きました。

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 }));
});

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

どのように解決するのですか?

ドキュメントを見たり、自分で実験して確認したところ、期待値として渡されたpropsの中に入れ子になっているオブジェクトの扱いに違いがあるようです。

期待オブジェクトが、オブジェクトを含むプロパティを持っている場合、そのプロパティには を含むオブジェクトを含むプロパティがある場合、そのオブジェクトはすべてではありませんが を、実際のオブジェクトの同等のプロパティに含まれるプロパティの、その時。

例(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)
    }
  });