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:
-
Ettearvamatu kontekst:
thisvää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õibthisväärtus olla erinev, kui ootate. See tekitab raskusi veaotsingul ja koodi hooldamisel. -
Keskkonna sõltuvus: Erinevates testiraamistikutes (
Mocha,Jest,Cypress) ja seadistustes (strict mode) võibthiskontekst käituda erinevalt. See raskendab koodi ülekantavust. -
Paralleelne täitmine: Kui testid käivitatakse paralleelselt sama testiklassi või objekti eksemplariga, võib
thisolla ü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);
});
});