Метод fake
Метод Http::fake применяется в тестах для подмены HTTP-клиента. Он перехватывает все исходящие запросы и возвращает заранее определённые ответы, что позволяет тестировать код, зависящий от внешних API, без реальных сетевых вызовов. Первым параметром передаётся URL или массив URL для подмены, вторым - ответ или массив ответов.
Синтаксис
<?php
use Illuminate\Support\Facades\Http;
Http::fake($url, $response);
?>
Пример
Давайте подменим запрос к API и вернём фиктивный ответ:
<?php
use Illuminate\Support\Facades\Http;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class HttpTest extends TestCase
{
public function test_fake_http_request()
{
Http::fake([
'api.example.com/users' => Http::response(['id' => 1, 'name' => 'John'], 200)
]);
$res = Http::get('api.example.com/users');
echo $res->json('name');
}
}
?>
Результат выполнения кода:
"John"
Пример
Давайте подменим все запросы к API одним фиктивным ответом:
<?php
use Illuminate\Support\Facades\Http;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class HttpTest extends TestCase
{
public function test_fake_all_requests()
{
Http::fake([
'api.example.com/*' => Http::response(['status' => 'success'], 200)
]);
$res = Http::get('api.example.com/users');
echo $res->json('status');
}
}
?>
Результат выполнения кода:
"success"
Пример
Давайте подменим запрос с разными ответами в зависимости от метода:
<?php
use Illuminate\Support\Facades\Http;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class HttpTest extends TestCase
{
public function test_fake_with_different_methods()
{
Http::fake([
'api.example.com/users' => Http::response(['id' => 2], 201),
'api.example.com/posts' => Http::response(['title' => 'Test'], 200)
]);
$res1 = Http::post('api.example.com/users');
$res2 = Http::get('api.example.com/posts');
echo $res1->json('id') . ' ' . $res2->json('title');
}
}
?>
Результат выполнения кода:
"2 Test"
Пример
Давайте используем замыкание для динамического ответа:
<?php
use Illuminate\Support\Facades\Http;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class HttpTest extends TestCase
{
public function test_fake_with_closure()
{
Http::fake(function ($request) {
if ($request->url() === 'api.example.com/users') {
return Http::response(['count' => 5], 200);
}
return Http::response(['error' => 'Not found'], 404);
});
$res = Http::get('api.example.com/users');
echo $res->json('count');
}
}
?>
Результат выполнения кода:
"5"
Смотрите также
-
метод
assertSent,
который проверяет, был ли отправлен определённый запрос -
класс
Http,
который предоставляет методы для тестирования HTTP-запросов -
метод
assertSent,
который проверяет отправку запроса с определёнными параметрами -
метод
assertSent,
который позволяет проверить количество отправленных запросов