' .toMatchObject'之间的区别是什么?和' objectContaining'

时间:2017-08-15 12:02:04

标签: javascript jestjs

我写了以下测试:

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 }));
});
他们两个似乎都通过了考试,他们之间有什么区别吗?他们之间有性能影响吗?

3 个答案:

答案 0 :(得分:32)

从查看文档和我自己的实验来确认它,区别在于处理嵌套在作为期望传递的道具中的对象。

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

  • toMatchObject仍会传递as seen in the docs

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

答案 1 :(得分:3)

我的想法是expect.objectContaining(和其他类似的匹配器)可以用来代替" object"中的文字值。你传递给其他匹配者。

此示例来自文档:

f <- function (y) ( (beta1/y) * ((y/alpha1)^beta1) * exp(-((y/alpha1)^beta1)) );
f1 <- function (y) sapply(y,f);
R = integrate( f1, 1e-10, 10 );

所以,虽然他们似乎在你的例子中做了同样的事情,但期望。*的那些在其他方面也很有用。

答案 2 :(得分:0)

即使两个结构之间没有功能差异,这里举例说明为什么expect.objectContaining - 虽然与toMatchObject相比冗长而繁琐,但却很有用:

describe('list of X', () => {
  it('should contain an element with a specific ID', () => {
    const listOfItems = uut.getItems();
    expect(listOfItems).toContainEqual(expect.objectContaining({id: 'some-id'}));
  });
});

即使listOfItems包含这样的项目(例如,除了&#39; id&#39;之外的其他字段) -

[
  {id: 'some-id', other: 'fields'},
  {id: 'some-other-id', even: 'more-fields'}
]

仍然expect.objectContaining允许一种简单的方式来实现比较,因为你期望(即严格基于id); toMatchObject根本不能在这里使用。因此,尽管toMatchObject简短且易读,但两者的较长结构更通用,并且允许更大的灵活性,因为它可以toMatchObject()无法使用。