stop va mock o'rtasidagi farq nima?
sobes.tech AI
AIdan javob
stop — bu, testni alohida qilish texnikasi bo‘lib, u to‘g‘ridan-to‘g‘ri bog‘liqliklarni (masalan, tashqi API chaqiriqlari, ma’lumotlar bazalari) testdan ajratib turish uchun haqiqiy ob’ektlarni test uchun mo‘ljallangan to‘xtatkichlar bilan almashtirishni o‘z ichiga oladi. Bu tashqi bog‘liqliklarning xulq-atvorini nazorat qilish va testlarni takrorlash imkoniyatini ta’minlash uchun ishlatiladi.
mock ("mock object" dan kelib chiqqan) — bu test uchun mo‘ljallangan to‘xtatkichlarning turidir, u nafaqat haqiqiy ob’ektni almashtiradi, balki test qilinayotgan kod uning bilan qanday o‘zaro ta’sir qilishini tekshirish imkonini ham beradi. Mocks yordamida metod chaqiruvlari, ularning argumentlari va chaqirishlar soni haqida (assert) aytish mumkin.
Shunday qilib, stop kengroq tushuncha bo‘lib, u izolyatsiyani tavsiflaydi, mock esa uni amalga oshirish uchun aniq vositadir, u o‘zaro ta’sirni tekshirish imkoniyatini qo‘shadi.
PHPUnit va Mockery bilan misol:
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
// Tashqi bog‘liqlikdan foydalanadigan sinf
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') {
// Faol foydalanuvchini qayta ishlash logikasi
return true;
}
return false;
}
}
// Mock yordamida test misoli
class UserProcessorTest extends TestCase
{
public function testProcessUserDataWithActiveUser()
{
// ApiClient uchun mock yaratamiz
$apiClientMock = Mockery::mock(ApiClient::class);
// Mock uchun kutilgan xulq-atvorni belgilaymiz
// fetchUserData metodining 123 argumenti bilan chaqirilishini kutamiz
$apiClientMock->shouldReceive('fetchUserData')
->with(123)
->andReturn(['status' => 'active', 'data' => '...']) // Mock bu ma’lumotlarni qaytaradi
->once(); // Metod faqat bir marta chaqirilishini kutamiz
// Test qilinadigan ob’ektni, unga mockni berib, yaratamiz
$userProcessor = new UserProcessor($apiClientMock);
// Test qilinadigan metodni chaqiramiz
$result = $userProcessor->processUserData(123);
// Natijani tekshiramiz
$this->assertTrue($result);
// Barcha kutishlar bajarilganligini tekshiramiz
Mockery::close();
}
}
Bu misolda, ApiClient o‘rniga "mock" qo‘yiladi. Biz haqiqiy API chaqiruvini "soxtalashtirdik" va fetchUserData(123) chaqirilganda ma’lum ma’lumotlarni qaytaradigan mockni sozladik. Shuningdek, bu metodning to‘g‘ri argumentlar bilan va bir marta chaqirilganligini tekshiramiz. Bu asosiy farq: mock o‘zaro ta’sirni tekshirish imkonini beradi.