Sobes.tech
Middle

რატომ არ შეიძლება გამოიყენოს 'this' საკვანძო სიტყვა ტესტების ავტომატიზაციის კონტექსტში?

sobes.tech AI

პასუხი AI-სგან

კონტექსტში JavaScript-ის ტესტების ავტომატიზაციის დროს, საკვანძო სიტყვა this არ არის რეკომენდებული გამოიყენოს ტესტის მდგომარეობის მონაცემების შენახვა ან გადაცემა (მაგალითად, მიმდინარე მომხმარებელი, ავტორიზაციის სტატუსი, გვერდის ინფორმაცია), რადგან:

  1. არასპეციფიკური კონტექსტი: this მნიშვნელობა განისაზღვრება იმ გზით, როგორ არის გამოძახებული ფუნქცია, არა იმ ადგილით, სადაც ის გამოაცხადა. ასინქრონულ კოდში (Promis'ები, async/await, callback-ები) ან სლაკის ფუნქციების გამოყენებისას, this მნიშვნელობა შეიძლება იყოს ის, რასაც არ ელით. ეს იწვევს დეფექტებს დეფექტების გამოვლენასა და კოდის შენარჩუნებაში.

  2. გარემოს დამოკიდებულება: სხვადასხვა ტესტის ჩარჩოებში (Mocha, Jest, Cypress) და კონფიგურაციებზე (strict mode) this კონტექსტი შეიძლება განსხვავებულად იქცეს. ეს ართულებს კოდის გადატანადობას.

  3. პარალელური შესრულების სირთულე: როდესაც ერთსა და იმავე ტესტის კლასის ან ობიექტის მაგალითს იყენებთ პარალელურად, this შეიძლება გადაწერილ იყოს სხვა შესრულების ნაკადით, რაც იწვევს race conditions-ს და არასწორ შედეგებს.

გადმოცემის ნაცვლად this-ის გამოყენების, უკეთესია:

  • ადგილობრივი ცვლადები ტესტის შემთხვევებში.
  • ცვლადები, რომლებიც გადაეცემა როგორც არგუმენტები დახმარების ფუნქციებს.
  • სპეციალიზებული ობიექტები ან კლასები მდგომარეობის შენახვისთვის (მაგალითად, Page Objects).
  • გლობალური ცვლადები ან singleton-ები (სიფრთხილით, მხოლოდ საჭიროების შემთხვევაში).

ასინქრონულ კოდში this-თან დაკავშირებული მაგალითი:

// Mocha-ს მაგალითი
describe('ავტორიზაციის ტესტი', function() {
  this.currentUser = null; // მდგომარეობა შენახულია `this`-ში

  it('უნდა ავტორიზდეს', async function() {
    await login('testUser', 'password');
    this.currentUser = 'testUser'; // `this` ეხება ტესტის კონტექსტს
  });

  it('უნდა შემოწმდეს პროფილი', async function() {
    // აქ `this` არ შეიცავს currentUser-ს,
    // თუ 'უნდა ავტორიზდეს' ტესტი ასინქრონულად შესრულდა
    // ან თუ ფუნქციის კონტექსტი შეიცვალა
    console.log(this.currentUser); // შეიძლება იყოს null ან undefined
  });
});

საუკეთესო მიდგომა — მონაცემების გადაცემა არგუმენტებად ან Page Objects-ის გამოყენება:

// დახმარების ფუნქცია
async function checkUserProfile(userName) {
  // კონკრეტული მომხმარებლის პროფილის შემოწმების ლოგიკა
}

describe('ავტორიზაციის ტესტი', function() {
  it('უნდა ავტორიზდეს და შემოწმდეს პროფილი', async function() {
    const user = 'testUser';
    await login(user, 'password');
    // მომხმარებლის გადაცემა არგუმენტად
    await checkUserProfile(user);
  });
});