- Published on
Playwright (4. díl) - Testování API - Porovnání objektů
Obsah objektu vs. identita objektu
V JavaScriptu (a tedy i v Playwright testech) je důležité rozlišovat dva typy porovnání objektů:
- Identita (stejný objekt v paměti)
- Rovnost obsahu (deep equality – mají stejné hodnoty)
Identita objektu (===)
Pokud použijeme ===, kontroluje se, zda jde o stejnou referenci v paměti.
const objA = { message: 'Hello' }
const objB = objA
const objC = { message: 'Hello' }
console.log(objA === objB) // true → je to stejný objekt
console.log(objA === objC) // false → jiný objekt, i když má stejný obsah
Tedy objA a objC mají shodný obsah, ale jsou to různé objekty.
Rovnost obsahu v testech (toEqual)
Pokud nám nezáleží na tom, zda jde o ten samý objekt, ale chceme ověřit, že mají stejné vlastnosti a hodnoty, použijeme toEqual() (v testech) nebo hluboké porovnání (deep equality).
const objA = { message: 'Hello' }
const objC = { message: 'Hello' }
expect(objA).toEqual(objC) // projde, protože obsah je stejný
Z hlediska obsahu jsou si rovné, i když v paměti jde o dva různé objekty.
Porovnání identity v testech (toBe)
Pokud opravdu chceme ověřit, že jde o tentýž objekt (stejná reference), použijeme v testech toBe().
const objA = { message: 'Hello' }
const objB = objA
const objC = { message: 'Hello' }
expect(objA).toBe(objB) // PASS - stejný objekt v paměti
expect(objA).toBe(objC) // FAIL - různé objekty (i když obsah je stejný)
Porovnávání v polích
Pokud API vrací pole objektů, pak toContainEqual kontroluje rovnost obsahu (deep equality), nikoli identitu.
const data = [{ id: 1, name: 'test' }]
expect(data).toContainEqual({ id: 1, name: 'test' }) // PASS - stejný obsah
expect(data).toContain({ id: 1, name: 'test' }) // FAIL - fungovalo by jen pokud by to byla stejná reference

