Sobes.tech
Middle

Miks ei saa testautomaatika kontekstis kasutada märksõna 'this'?

sobes.tech AI

Vastus AI-lt

Testi automatiseerimise kontekstis JavaScriptis ei soovitata võtmesõna this kasutada testi oleku andmete salvestamiseks või edastamiseks (näiteks, praegune kasutaja, sisselogimise staatus, lehe teave), kuna:

  1. Ettearvamatu kontekst: this väärtus määratakse selle järgi, kuidas funktsioon kutsutakse, mitte selle järgi, kus see on deklareeritud. Asünkroonilises koodis (Promis'id, async/await, callback'id) või noolefunktsioonide kasutamisel võib this väärtus olla erinev, kui ootate. See tekitab raskusi veaotsingul ja koodi hooldamisel.

  2. Keskkonna sõltuvus: Erinevates testiraamistikutes (Mocha, Jest, Cypress) ja seadistustes (strict mode) võib this kontekst käituda erinevalt. See raskendab koodi ülekantavust.

  3. Paralleelne täitmine: Kui testid käivitatakse paralleelselt sama testiklassi või objekti eksemplariga, võib this olla üle kirjutatud teise täitmisvoo poolt, mis põhjustab race conditions ja ebaõigeid tulemusi.

Asenduseks this-ga on soovitatav:

  • Kohalikud muutujad testide sees.
  • Muutujad, mis edastatakse argumendina abifunktsioonidele.
  • Spetsialiseeritud objektid või klassid oleku salvestamiseks (näiteks Page Objects).
  • Globaalmuutujad või singletonid (olla ettevaatlik, ainult vajadusel).

Näide this-ga seotud probleemist asünkroonilises koodis:

// Näide Mocha-ga
describe('Autentimise test', function() {
  this.currentUser = null; // Oleku salvestamine `this`-sse

  it('peab autentima', async function() {
    await login('testUser', 'password');
    this.currentUser = 'testUser'; // `this` viitab testi kontekstile
  });

  it('peab kontrollima profiili', async function() {
    // Siin `this` EI SÄILITA currentUser-i,
    // kui `peab autentima` test on asünkroonselt täidetud
    // või funktsiooni kontekst on muutunud
    console.log(this.currentUser); // Võib olla null või undefined
  });
});

Parim lähenemine — andmete edastamine argumentidena või Page Objects kasutamine:

// Abi-funktsioon
async function checkUserProfile(userName) {
  // konkreetse kasutaja profiili kontrollimise loogika
}

describe('Autentimise test', function() {
  it('peab autentima ja kontrollima profiili', async function() {
    const user = 'testUser';
    await login(user, 'password');
    // kasutaja edastamine argumendina
    await checkUserProfile(user);
  });
});