我已经编写了以下测试:

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

他们两个似乎都通过了测试,两者之间有什么区别吗?它们之间对性能有影响吗?

最佳答案

通过查看文档以及我自己的实验来确认它,不同之处在于对嵌套在作为期望传递的 Prop 中的对象的处理。

如果期望对象具有一个包含对象的属性,该属性包含实际对象的等效属性中的一些但不是全部属性,则:

  • toMatchObject仍会传递as seen in the docs
  • Expect.objectContaining将失败(除非您使用Expect.objectContaining()在Expectation对象本身中声明该属性)

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

    09-13 00:43