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:
-
Nenumatytas kontekstas:
thisreikš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,thisreikšmė gali būti kitokia nei tikitės. Tai sukelia derinimo ir palaikymo sunkumų. -
Aplinkos priklausomybė: Skirtinguose testų rėmuose (
Mocha,Jest,Cypress) ir priklausomai nuo nustatymų (strict mode),thiskontekstas gali elgtis skirtingai. Tai apsunkina kodo pernešamumą. -
Paralelės vykdymo sudėtingumas: Vykdant testus paraleliai su tuo pačiu testų klasės ar objekto egzemplioriumi,
thisgali 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);
});
});