Logo Light
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ů:

  1. Identita (stejný objekt v paměti)
  2. 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