Sobes.tech
Middle

фарқияти байни stop ва mock чист?

sobes.tech AI

Ҷавоб аз AI

stop — техникаи ҷудо кардани озмоиш аз вобастагиҳои мустақим (масалан, занг задан ба API-ҳои хориҷӣ, базаҳои додаҳо) тавассути иваз кардани объектҳои воқеӣ бо мокулаҳои озмоишӣ. Он барои назорат кардани рафтори вобастагиҳои беруна ва таъмини такрорпазирии озмоишҳо истифода мешавад.

mock (аз "mock object") — навъе аз мокулаи озмоишӣ, ки на танҳо объектҳои воқеиро иваз мекунад, балки имкон медиҳад, ки чӣ гуна коди озмоишшаванда бо он ҳамкорӣ мекунад, санҷида шавад. Бо ёрии mock-ҳо метавон дар бораи зангҳои методҳо, аргументҳои онҳо ва шумораи зангҳо изҳорот дод.

Аз ин рӯ, 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);

        // Санҷиши иҷрои ҳамаи интизорӣҳои mock
        Mockery::close();
    }
}

Дар ин мисол ApiClient бо "mock" иваз мешавад. Мо занг задан ба API-ро боздоштем ва ҳамзамон mock-ро барои баргардонидани маълумоти муайян дар вақти занг задан ба fetchUserData(123) танзим кардем. Ҳамчунин, мо санҷидаем, ки ин метод бо аргументҳои дуруст ва як маротиба занг зада шудааст. Ин фарқияти асосӣ аст: mock имкон медиҳад, ки ҳамкориро санҷиш кардан мумкин аст.