Sobes.tech
Middle

Kodėl negalima naudoti raktažodžio 'this' testų automatizavimo kontekste?

sobes.tech AI

Atsakymas iš AI

Kontekste automatizuotų testų JavaScript, raktinis žodis this nerekomenduojamas naudoti testų būsenos duomenų saugojimui ar perdavimui (pavyzdžiui, dabartinis vartotojas, autorizacijos būsena, puslapio informacija), nes:

  1. Nenumatytas kontekstas: this reikšmė nustatoma pagal tai, kaip iškviečiama funkcija, o ne pagal vietą, kur ji paskelbta. Asinchroniniame kode (Promis'ai, async/await, callback'ai) arba naudojant rodyklės funkcijas, this reikšmė gali būti kitokia nei tikitės. Tai sukelia derinimo ir palaikymo sunkumų.

  2. Aplinkos priklausomybė: Skirtinguose testų rėmuose (Mocha, Jest, Cypress) ir priklausomai nuo nustatymų (strict mode), this kontekstas gali elgtis skirtingai. Tai apsunkina kodo pernešamumą.

  3. Paralelės vykdymo sudėtingumas: Vykdant testus paraleliai su tuo pačiu testų klasės ar objekto egzemplioriumi, this gali būti perrašytas kito vykdymo srauto, kas sukelia race conditions ir neteisingus rezultatus.

Vietoj this rekomenduojama naudoti:

  • Vietinius kintamuosius testų atvejose.
  • Kintamuosius, perduodamus kaip argumentus pagalbinėms funkcijoms.
  • Specializuotus objektus ar klases būsenai saugoti (pvz., Page Objects).
  • Globalius kintamuosius ar singleton'us (atsargiai, tik jei būtina).

Pavyzdys su this asinchroniniame kode:

// Pavyzdys su Mocha
describe('Prisijungimo testas', function() {
  this.currentUser = null; // Būseną saugo `this`

  it('turėtų prisijungti', async function() {
    await login('testUser', 'password');
    this.currentUser = 'testUser'; // `this` nurodo į testavimo kontekstą
  });

  it('turėtų patikrinti profilį', async function() {
    // Čia `this` NE TURĖS currentUser,
    // jei `turėtų prisijungti` testas įvykdytas asinchroniškai
    // arba funkcijos kontekstas pasikeitė
    console.log(this.currentUser); // Gali būti null arba undefined
  });
});

Geriausias būdas — perduoti duomenis kaip argumentus arba naudoti Page Objects:

// Pagelbinė funkcija
async function checkUserProfile(userName) {
  // konkretaus naudotojo profilio patikros logika
}

describe('Prisijungimo testas', function() {
  it('turėtų prisijungti ir patikrinti profilį', async function() {
    const user = 'testUser';
    await login(user, 'password');
    // perduoti naudotoją kaip argumentą
    await checkUserProfile(user);
  });
});