Метод assertJsonFragment
Метод assertJsonFragment применяется к объекту ответа, полученному в тестах
после выполнения HTTP-запросов. Он проверяет, содержит ли JSON-ответ указанный
фрагмент данных. Фрагмент может быть передан в виде ассоциативного массива,
где ключи соответствуют полям JSON, а значения - ожидаемым данным.
Метод выполняет проверку независимо от остальной структуры ответа,
что делает его удобным для проверки наличия конкретных данных
в больших и сложных JSON-ответах.
Синтаксис
<?php
$response->assertJsonFragment($fragment);
?>
Параметр $fragment представляет собой массив с данными,
которые должны присутствовать в JSON-ответе.
Пример
Давайте протестируем эндпоинт, который возвращает данные пользователя, и проверим наличие конкретного идентификатора и имени в ответе:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_user_response_contains_expected_fields()
{
$user = User::factory()->create([
'name' => 'John Doe',
'email' => 'john@example.com',
]);
$response = $this->getJson("/api/users/{$user->id}");
$response->assertJsonFragment([
'id' => $user->id,
'name' => 'John Doe',
]);
}
}
?>
Результат выполнения теста:
"Test passed: JSON response contains the expected fragment"
Пример
Проверим наличие нескольких полей в ответе при получении списка статей, не обращая внимание на полную структуру ответа:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Article;
class ArticleTest extends TestCase
{
public function test_articles_list_contains_specific_data()
{
Article::factory()->create([
'title' => 'Laravel Testing Guide',
'status' => 'published',
'views' => 100,
]);
$response = $this->getJson('/api/articles');
$response->assertJsonFragment([
'title' => 'Laravel Testing Guide',
'status' => 'published',
]);
}
}
?>
Результат выполнения кода:
"Test passed: JSON response contains the article fragment"
Пример
Проверим наличие фрагмента в ответе при создании новой записи через POST-запрос:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class PostTest extends TestCase
{
public function test_post_creation_returns_expected_data()
{
$postData = [
'title' => 'New Post Title',
'content' => 'Post content goes here',
'category' => 'tech',
];
$response = $this->postJson('/api/posts', $postData);
$response->assertJsonFragment([
'title' => 'New Post Title',
'category' => 'tech',
]);
}
}
?>
Результат выполнения кода:
"Test passed: POST response contains the expected fragment"
Пример
Давайте проверим наличие вложенного фрагмента в JSON-ответе:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Order;
use App\Models\Product;
class OrderTest extends TestCase
{
public function test_order_response_contains_nested_data()
{
$order = Order::factory()->create();
$product = Product::factory()->create([
'name' => 'Laptop',
'price' => 999,
]);
$order->products()->attach($product);
$response = $this->getJson("/api/orders/{$order->id}");
$response->assertJsonFragment([
'name' => 'Laptop',
'price' => 999,
]);
}
}
?>
Результат выполнения кода:
"Test passed: Nested JSON fragment found"
Пример
Проверим наличие фрагмента с использованием нескольких условий в одном утверждении:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Product;
class ProductTest extends TestCase
{
public function test_product_list_contains_specific_fragments()
{
Product::factory()->create([
'code' => 'PRD-001',
'name' => 'Smartphone',
'stock' => 50,
'active' => true,
]);
$response = $this->getJson('/api/products');
$response->assertJsonFragment([
'code' => 'PRD-001',
'active' => true,
'stock' => 50,
]);
}
}
?>
Результат выполнения кода:
"Test passed: JSON contains all required fragments"
Смотрите также
-
метод
assertJson,
который проверяет соответствие JSON-ответа указанным данным -
метод
assertJsonPath,
который проверяет значение по конкретному пути в JSON -
метод
assertJsonCount,
который проверяет количество элементов в JSON-массиве -
метод
assertJsonStructure,
который проверяет структуру JSON-ответа