de Iain Nash

Cum să bat în joc corect Moment.js / dates în Jest

Cum sa bat in joc corect Momentjs dates in

Orele și datele sunt infam de greu pentru a implementa corect în cod. Acest lucru face ca data și ora de testare să fie corecte în mod corect. Testarea permite raționamentul în jurul logicii în cod și, de asemenea, permite detectarea cazurilor de margine sau a erorilor înainte ca acestea să aibă impact asupra utilizatorilor.

O greșeală obișnuită atunci când testați data și codul orar este să nu setați ora curentă la o oră statică. Dacă codul din interfața de utilizare redă data de astăzi și este testat corect, testul care funcționează numai până când ora curentă se schimbă prea mult. Javascript expune încorporat Date obiect care permite recuperarea timpului curent prin construcție fără argumente sau apel la now() proprietate.

Moment.js este o populară bibliotecă de manipulare a datei front-end care este utilizată în mod obișnuit pentru a manipula, încărca, formata și schimba timpul. Folosește un constructor gol pentru a obține ora curentă. Jestul este adesea utilizat împreună cu aplicațiile Moment și React. În plus, testarea instantaneului Jest introduce noi dependențe de dată și oră, care sunt importante de luat în considerare. Mai jos este un exemplu de componentă problematică care redă ziua curentă:

Un test inițial pentru TodayIntro componenta ar putea arăta ca:

Cu toate acestea, acest test va eșua în orice zi care nu este 23 ianuarie. O soluție la acest lucru este să înlocuiți funcția de dată a Javascript pentru a returna o dată cunoscută pentru a lucra la scrierea testelor.

ad-banner

Acest cod înlocuiește constructorul Date pentru a seta o dată „curentă” statică:

O soluție ineficientă este să faceți singuri data la matematică față de ora curentă a testului. Acesta este un test ineficient, deoarece rulați același cod pe care îl testați pentru a testa valoarea returnată. De exemplu, dacă se testează prin compararea datelor formatate cu momentul, nu s-ar prinde dacă codul de formatare a momentului se schimbă MMM la JAN in loc de Jan .

Modalități de a seta o oră statică și un fus orar pentru Jest / JS

  1. Utilizați o bibliotecă pentru a elimina obiectul Date pentru a returna o dată statică și un fus orar (vă recomandăm MockDate pentru cazuri simple, dar citiți mai departe pentru o defalcare a alternativelor)
  2. A-și bate joc moment().format() pentru a returna un șir static
  3. Batjocorește Date constructor și now() funcție pentru a returna un timp static

Folosirea unei biblioteci în acest caz este de preferat, deoarece aceste biblioteci sunt bine testate, nu introduceți codul boilerplate și gestionați în mod transparent datele ambelor cazuri pot fi create (Date.now() vs. new Date() etc.). În plus, utilizarea unei biblioteci permite urmărirea cu ușurință a codului de testare și setarea unui timp specific pe test, care permite practici mai bune de testare.

  • MockDate oferă funcționalități suplimentare pentru fusurile orare și este ușor de utilizat
  • sinon oferă Data și cronometrul (setTimeout etc.) batjocuri
  • Setarea manuală a simulării poate fi utilă în medii limitate, însă poate deveni destul de complicată
  • jasmine (nu este inclus în glumă), vine cu un jasmine.clock ()

Exemplele de mai jos sunt folosite MockDate, care se concentrează doar pe batjocorirea obiectului Date și gestionează testarea compensării fusului orar, precum și pentru testarea conversiei fusului orar local.

A test instantaneu, de asemenea, este simplu de testat cu date batjocorite:

De cand enzimă este o bibliotecă minunată, un exemplu de enzimă superficial:

Cum să (mai bine) testați logica datei

Datele au o mulțime de cazuri marginale și logică în spatele lor. Când testați datele, asigurați-vă că acoperiți cazurile marginale și nu setați doar o dată specifică pentru testare și pentru a merge mai departe. Datele pot varia, de asemenea, în funcție de localizare și fusul orar.

Datele de testare corespunzătoare necesită motivarea în jurul cazurilor marginale care ar putea apărea și scrierea testelor pentru a se asigura că aceste cazuri marginale se comportă așa cum era de așteptat și că modificările viitoare ale codului sau bibliotecilor utilizate în aplicația dvs. nu încalcă aceste ipoteze. În plus, adăugarea unui cod pentru a seta data și ora curente la o dată și oră statice în toate codurile de testare poate fi mai ușoară, dar împiedică un raționament bun în ceea ce privește testarea Datelor și ascunde ipotezele de testare în codul bibliotecii.

Iată câteva ipoteze incorecte și adesea implicite despre date:

  1. Clienții există cu toții într-un singur fus orar și ora de vară
  2. Toți clienții există în fusul orar al dezvoltatorului
  3. Lungimea numelui unei luni este relativ similară
  4. Ceasurile de server sunt întotdeauna corecte
  5. Serverul cunoaște setările de fus orar / oră ale clientului

Acest test presupune că serverul se află întotdeauna în fusul orar corect și că fusul orar este setat corect. În schimb, setați fusul orar și asigurați-vă că data se potrivește corect cu fusul orar local.

Este important să vă asigurați că atunci când testele accesează ora curentă, „ora curentă” este setată la o valoare statică. Dacă valoarea este dinamică, fie testele se întrerup în cele din urmă, fie testul se testează în raport cu valorile dinamice. Valorile dinamice nu sunt eficiente la testarea comportamentului, deoarece un bug nu va fi expus prin compararea valorii returnate a două funcții care sunt aceleași comparativ cu compararea cu o valoare statică care nu se modifică odată cu modificarea codului.

Privind în perspectivă: stocarea și proiectarea datei

A avea cerința de a adăuga teste la o bază de cod nu oferă neapărat nicio valoare, cu excepția cazului în care aceste teste sunt revizuite, rulate și motivate la fel de strict ca și rularea codului.

Logica datei și orei introduce un set mare de posibilități în ceea ce privește comportamentul și rezultatul, făcând un puternic stimulent pentru a testa eficient data și ora. Dincolo de testare, recunoașterea și păstrarea datelor relevante împreună cu o strategie de sincronizare și stocare a orelor de dată în mod consecvent între sisteme devreme contribuie la testare și asigură o experiență mai bună a utilizatorului.

Aceste sfaturi și abordări se aplică mai mult decât testarea Javascript și Jest pentru date și ore. De asemenea, funcționează într-un context NodeJS și într-un sens general în jurul lucrurilor cheie de testat în sistemele care gestionează data și ora în general. În multe cazuri, este ideală stocarea timpului pe server în UTC (ora coordonată universală), apoi conversia în fusul orar local pe baza setărilor clientului / browserului. Dacă clientul este inaccesibil, stocarea atât a orei UTC, cât și a fusului orar real al utilizatorului este o modalitate eficientă de a trata în mod consecvent datele și orele.