Sparround

JSON və data ilə iş

JSON — API testlərinin dilidir. İki funksiya kifayət edir:

  • JSON.parse(mətn) — JSON sətrini JavaScript obyektinə çevirir
  • JSON.stringify(obyekt) — obyekti JSON sətrinə çevirir; ikinci və üçüncü arqumentlə oxunaqlı format alınır: JSON.stringify(obj, null, 2)

Praktikada Playwright-ın response.json() metodu parse-ı özü edir — əl ilə JSON.parse çağırmağa çox vaxt ehtiyac qalmır. JSON.parse düz mətnlə işlədikdə (fayldan oxunan fixture, process.env-dəki konfiq) lazım olur.

DİQQƏT: JSON.parse yararsız mətndə xəta atır. Boş cavabı və ya HTML səhv səhifəsini parse etməyə çalışanda test anlaşılmaz Unexpected token < in JSON mesajı ilə düşür — bu, əslində serverin JSON yox, HTML qaytardığının əlamətidir.

Giriş dəyəriJSON.stringify-dan sonraNəticə
undefined sahəsahə tamamilə itir"sahə yoxdur" ilə "sahə boşdur" fərqi silinir
Date obyektiISO stringgeri parse edəndə Date yox, string alırsan
funksiya / metoditirclass instansiyası adi obyektə çevrilir
NaN, Infinitynullhesablama səhvi gizlənir
Map, Setboş obyekt {}data səssizcə itir
dairəvi istinadTypeError atılırlog-a obyekt yazarkən rast gəlinir

Dərin datadan təhlükəsiz oxumaq. API cavabı iç-içə olanda hər səviyyəni yoxlamaq əvəzinə ?.?? istifadə et:

const city = body.items?.[0]?.shipping?.address?.city ?? 'unknown';

Bir sahə yoxdursa test Cannot read properties of undefined ilə deyil, aydın assertion mesajı ilə düşür.

Cavabın formasını yoxlamaq (contract testing). Dəqiq dəyərləri yox, strukturu və tipləri yoxla — belə test data dəyişəndə sınmır, müqavilə pozulanda isə düşür:

  • massivdirmi: Array.isArray(body.items)
  • tip: typeof body.total === 'number'
  • açar mövcuddurmu: 'status' in order
  • Playwright/Jest matcher-ləri: expect.objectContaining, expect.any(String), expect.arrayContaining

Dərin kopya üçün JSON.parse(JSON.stringify(obj)) köhnə tərzdir və yuxarıdakı bütün itkilərə səbəb olur. Müasir həll — structuredClone(obj): Date, Map, Set, iç-içə massivləri düzgün kopyalayır (funksiyaları isə yox — onlarda xəta atır).

İnterview üçün qısa cavab hazırla: "JSON round-trip dərin kopya deyil, sadələşdirmədir: undefined və funksiyalar itir, Date string olur, NaN null-a çevrilir. Ona görə test datasını `structuredClone` ilə və ya factory funksiya ilə kopyalayıram."

📚 Mənbələr və sənədlər

  • JSONrəsmideveloper.mozilla.org