Sobes.tech
Middle

რა განსხვავებაა stop და mock-ს შორის?

sobes.tech AI

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

stop — ეს არის ტაქტიკა ტესტის იზოლაციისთვის პირდაპირი დამოკიდებულებებისგან (მაგალითად, გარე API-ების ზარები, მონაცემთა ბაზები) რეალური ობიექტების ნაცვლად ტესტის ჩაშენებული სადგამების გამოყენებით. იგი გამოიყენება გარე დამოკიდებულებების ქცევის კონტროლისთვის და ტესტების გამეორებადობის უზრუნველსაყოფად.

mock ("mock object") — ეს არის ტიპი ტესტის სადგამის, რომელიც არა მხოლოდ აძლიერებს რეალურ ობიექტს, არამედ საშუალებას აძლევს გადაამოწმოს, როგორ ურთიერთქმედებს ტესტირებადი კოდი მასთან. მოკების საშუალებით შეიძლება დადასტურება (assert) მეთოდების გამოძახებების, მათი არგუმენტების და გამოძახებების რაოდენობის შესახებ.

ამიტომ, stop არის ზოგადი ცნება, რომელიც აღწერს იზოლაციას, ხოლო mock არის კონკრეტული ინსტრუმენტი მის მისაღწევად, რომელიც დამატებით საშუალებას აძლევს ვალიდაციას ურთიერთქმედების.

მაგალითი PHPUnit და Mockery გამოყენებით:

<?php

use PHPUnit\Framework\TestCase;
use Mockery;

// კლასი, რომელიც იყენებს გარე დამოკიდებულებას
class UserProcessor
{
    private $apiClient;

    public function __construct(ApiClient $apiClient)
    {
        $this->apiClient = $apiClient;
    }

    public function processUserData(int $userId): bool
    {
        $data = $this->apiClient->fetchUserData($userId);

        if ($data && $data['status'] === 'active') {
            // აქტიური მომხმარებლის დამუშავების ლოგიკა
            return true;
        }
        return false;
    }
}

// მაგალითი mock-ის გამოყენებით ტესტის ჩასატარებლად
class UserProcessorTest extends TestCase
{
    public function testProcessUserDataWithActiveUser()
    {
        // Mock-ის შექმნა ApiClient-ისთვის
        $apiClientMock = Mockery::mock(ApiClient::class);

        // მოლოდინული ქცევის დაყენება mock-ზე
        // ველით `fetchUserData` მეთოდის გამოძახებას 123 არგუმენტით
        $apiClientMock->shouldReceive('fetchUserData')
                      ->with(123)
                      ->andReturn(['status' => 'active', 'data' => '...']) // mock-ის დაბრუნებული მონაცემები
                      ->once(); // ველით, რომ მეთოდი მხოლოდ ერთხელ გამოიძახება

        // ტესტირებადი ობიექტის შექმნა mock-თან ერთად
        $userProcessor = new UserProcessor($apiClientMock);

        // ტესტის მეთოდის გაშვება
        $result = $userProcessor->processUserData(123);

        // შედეგის შემოწმება
        $this->assertTrue($result);

        // ვამოწმებთ, რომ ყველა მოლოდინი შესრულდა
        Mockery::close();
    }
}

ამ მაგალითში ApiClient შეიცვალა "მოკით". ჩვენ გავაჩერეთ რეალური API-ზარი და ერთდროულად დავაყენეთ mock, რომ fetchUserData(123) გამოძახებისას გარკვეული მონაცემები დაბრუნდეს. ასევე ვამოწმებთ, რომ ეს მეთოდი გამოიძახა სწორ არგუმენტებთან და მხოლოდ ერთხელ. ეს არის ძირითადი განსხვავება: mock საშუალებას აძლევს ურთიერთქმედებების ვალიდაციას.