Ի՞նչ է տարբերությունը 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-ը թույլ է տալիս ստուգել փոխազդեցությունները։