Javascript 什么';这就是';之间的区别;。toMatchObject';和';对象包含';

Javascript 什么';这就是';之间的区别;。toMatchObject';和';对象包含';,javascript,jestjs,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, {

我编写了以下测试:

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

他们两人似乎都通过了考试,他们之间有什么区别吗?它们之间是否存在性能影响

我的想法是,可以使用
expect.objectContaining
(以及其他类似的匹配器)代替传递给其他匹配器的“对象”中的文本值

此示例来自以下文档:

test('onPress被正确调用',()=>{
const onPress=jest.fn();
模拟压力(onPress);
expect(onPress).toBeCalledWith(expect.objectContaining({
x:预计。任何(数字),
y:预计。任何(数字),
}));
});

因此,虽然它们在您的示例中似乎做了相同的事情,
expect.*
它们在另一方面也很有用。

通过查看文档和我自己的实验来确认这一点,区别在于对作为预期传递的道具中嵌套的对象的处理

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

  • toMatchObject仍将通过

  • expect.objectContaining将失败(除非您使用expect.objectContaining()在Expection对象本身中声明该属性)

示例(开玩笑测试):


即使这两种结构之间没有功能上的差异,下面的示例说明了为什么
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
包含这样的项目(即,除“id”之外的字段)--


仍然
expect.objectContaining
允许使用一种简单的方法来实现预期的比较(即严格基于id)
toMatchObject
在这里根本不能使用。因此,虽然
toMatchObject
简短易读,但两者中较长的结构更通用,并允许更大的灵活性,因为它可以以
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'}));
  });
});
[
  {id: 'some-id', other: 'fields'},
  {id: 'some-other-id', even: 'more-fields'}
]