Класс Http
Класс Http из пространства имён Illuminate\Support\Facades
предоставляет удобный интерфейс для тестирования HTTP-клиента Laravel.
С его помощью можно подменить реальные HTTP-запросы фейковыми
ответами и проверять, какие запросы были отправлены.
Синтаксис
<?php
use Illuminate\Support\Facades\Http;
Http::fake($callback);
Http::assertSent($callback);
?>
Пример
Давайте создадим тест, который проверяет отправку запроса к внешнему API при регистрации пользователя:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Http;
use App\Models\User;
class UserRegistrationTest extends TestCase
{
public function test_user_registration_sends_http_request()
{
Http::fake();
$response = $this->post('/api/register', [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'password123',
]);
Http::assertSent(function ($request) {
return $request->url() == 'https://api.external.com/users' &&
$request->method() == 'POST';
});
$response->assertStatus(201);
}
}
?>
Пример
Теперь давайте эмулируем конкретный ответ от внешнего API
с помощью метода fake:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Http;
class ExternalApiTest extends TestCase
{
public function test_external_api_returns_success()
{
Http::fake([
'api.external.com/*' => Http::response([
'status' => 'success',
'data' => ['id' => 1, 'name' => 'John Doe']
], 200),
]);
$response = $this->getJson('/api/users/1');
$response->assertStatus(200)
->assertJson([
'status' => 'success',
'data' => ['id' => 1, 'name' => 'John Doe']
]);
Http::assertSentCount(1);
}
}
?>
Пример
Проверим количество и параметры отправленных запросов
с помощью метода assertSent:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Http;
use App\Models\Order;
class OrderTest extends TestCase
{
public function test_order_processing_sends_correct_data()
{
Http::fake();
$order = Order::create([
'user_id' => 1,
'amount' => 100,
'status' => 'pending',
]);
$response = $this->postJson('/api/orders/' . $order->id . '/process');
Http::assertSent(function ($request) use ($order) {
return $request->url() == 'https://payment.api/charge' &&
$request['order_id'] == $order->id &&
$request['amount'] == 100;
});
$response->assertStatus(200);
}
}
?>
Пример
Эмулируем ошибку от внешнего API и проверяем корректность обработки ошибки в нашем приложении:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Http;
class PaymentTest extends TestCase
{
public function test_payment_error_handling()
{
Http::fake([
'payment.api/charge' => Http::response([
'error' => 'Insufficient funds'
], 422),
]);
$response = $this->postJson('/api/pay', [
'amount' => 1000,
'card_token' => 'tok_test_123',
]);
$response->assertStatus(422)
->assertJson([
'error' => 'Payment failed'
]);
Http::assertSent(function ($request) {
return $request->hasHeader('Authorization');
});
}
}
?>
Смотрите также
-
метод
fake,
который подменяет реальные HTTP-запросы -
метод
assertSent,
который проверяет отправку запроса -
метод
getJson,
который выполняет GET-запрос в тестах -
метод
postJson,
который выполняет POST-запрос в тестах