Test avtomatlaşdırması kontekstində niyə 'this' açar sözündən istifadə etmək olmaz?
sobes.tech Süni İntellekt
AI-dan cavab
JavaScript-də test avtomatlaşdırması kontekstində, this açar sözü testin vəziyyəti haqqında məlumat saxlamaq və ya ötürmək üçün tövsiyə edilmir (məsələn, cari istifadəçi, autentifikasiya statusu, səhifə haqqında məlumat), çünki:
-
Qeyri-müəyyən kontekst:
thisdəyəri, funksiyanın necə çağırıldığına görə müəyyən edilir, onun elan olunduğu yerə deyil. Asinxron kodda (Promises,async/await, callbacklər) və ya ox funksiyalarından istifadə edildikdə,thisdəyəri gözlədiyiniz kimi olmaya bilər. Bu, debug və kodun saxlanmasını çətinləşdirir. -
Ətraf mühitə bağlılıq: Müxtəlif test çərçivələrində (
Mocha,Jest,Cypress) və tənzimləmələrdə (strict mode)thiskonteksti fərqli davranış göstərə bilər. Bu, kodun köçürülməsini çətinləşdirir. -
Paralel icranın mürəkkəbliyi: Eyni test sinfi və ya obyekt nümunəsindən istifadə edərək paralel testlərin icrası zamanı,
thisbaşqa bir icra axışı tərəfindən yenidən yazıla bilər, bu da yarış vəziyyətlərinə və düzgün olmayan nəticələrə səbəb olur.
this yerinə, aşağıdakı yanaşmalar üstün tutulmalıdır:
- Test hallarında yerli dəyişənlər.
- Köməkçi funksiyalara arqument kimi ötürülən dəyişənlər.
- Vəziyyəti saxlamaq üçün xüsusi obyektlər və ya siniflər (məsələn, Page Objects).
- Qlobal dəyişənlər və ya singletonlar (diqqətli olun, yalnız lazım olduqda).
Asinxron kodda this ilə bağlı problem nümunəsi:
// Mocha ilə nümunə
describe('Autentifikasiya testi', function() {
this.currentUser = null; // Vəziyyət `this` daxilində saxlanılır
it('giriş etməlidir', async function() {
await login('testUser', 'password');
this.currentUser = 'testUser'; // `this`, test kontekstinə istinad edir
});
it('profil yoxlamalıdır', async function() {
// Burada, `this` `currentUser`-i içerməyəcək,
// əgər 'giriş etməlidir' testi asinxron olaraq icra olunubsa
// və ya funksiyanın konteksti dəyişibsə
console.log(this.currentUser); // null və ya undefined ola bilər
});
});
Daha yaxşı yanaşma: məlumatları arqument kimi ötürmək və ya Page Objects istifadə etmək:
// Köməkçi funksiya
async function checkUserProfile(userName) {
// Müəyyən istifadəçi üçün profil yoxlama loqikası
}
describe('Autentifikasiya testi', function() {
it('giriş etməli və profil yoxlamalıdır', async function() {
const user = 'testUser';
await login(user, 'password');
// İstifadəçini arqument kimi ötürmək
await checkUserProfile(user);
});
});