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'}
]