D'après la documentation et mes propres expériences pour le confirmer, la différence réside dans la gestion des objets imbriqués dans les props transmis en tant qu'attente.
Si l'objet d'attente a une propriété, contenant un objet, qui contient certains mais pas tous des propriétés dans la propriété équivalente de l'objet réel, alors :
-
toMatchObject passe toujours, comme vu dans les docs .
-
expect.objectContaining échouera (sauf si vous déclarez cette propriété dans l'objet expectation lui-même avec expect.objectContaining())
Exemples (testés en 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)
}
});