У чему се састоји разлика између stop и mock?
sobes.tech АИ
Одговор од АИ
stop — техника је изолације теста од директних зависности (на пример, позивања на стране API-је, базе података) замењивањем реалних објеката тест-заглушкама. Она се користи за контролу понашања спољашњих зависности и обезбеђивање репродуктивности тестова.
mock (од "mock object") — врста тест-заглушке која не само да замењује реалан објекат, већ и омогућава проверу како тестирани код интерагује са њим. Помоћу mock-ова може се тврдити (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);
// Провера да су сва очекивања mock-а испуњена
Mockery::close();
}
}
У овом примеру ApiClient се замењује са "mock". Ми смо "заглушили" стварни позив API-ја и истовремено подесили mock да враћа одређене податке при позиву fetchUserData(123). Такође, верификујемо да је овај метод позван са исправним аргументима и једном. Ово је кључна разлика: mock омогућава проверу интеракција.