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 փոխարինվում է "mock"-ով։ Մենք "խաղաղեցրեցինք" իրական API-զանգը և միաժամանակ կարգավորեցինք mock-ով վերադարձնել որոշ տվյալներ fetchUserData(123) կանչի ժամանակ։ Նույնպես ստուգում ենք, որ այս մեթոդը կանչվել է ճիշտ արգումենտներով և միայն մեկ անգամ։ Սա է հիմնական տարբերությունը՝ mock-ը թույլ է տալիս ստուգել փոխազդեցությունները։