> ## Documentation Index
> Fetch the complete documentation index at: https://inertiajs-vi.tuantq.online/llms.txt
> Use this file to discover all available pages before exploring further.

# Kiểm thử

<Warning>Đây là tài liệu Inertia.js v1, phiên bản không còn được duy trì tích cực. Vui lòng tham khảo [tài liệu v3](/v3/getting-started/index).</Warning>

Có nhiều cách khác nhau để kiểm thử một ứng dụng Inertia. Trang này cung cấp cái nhìn tổng quan nhanh về các công cụ hiện có.

## Kiểm thử end-to-end

Một cách phổ biến để kiểm thử các page component JavaScript là dùng công cụ end-to-end như [Cypress](https://www.cypress.io/) hoặc [Laravel Dusk](https://laravel.com/docs/dusk). Đây là các công cụ tự động hóa trình duyệt cho phép chạy những mô phỏng thực tế của ứng dụng trong trình duyệt. Các test này thường chậm hơn; tuy nhiên, vì chúng kiểm thử ứng dụng ở đúng tầng mà người dùng cuối tương tác, chúng mang lại mức độ tin cậy cao rằng ứng dụng đang hoạt động chính xác. Và vì test chạy trong trình duyệt, code JavaScript cũng thực sự được thực thi và kiểm thử.

## Unit test phía client

Một cách khác để kiểm thử page component là dùng framework unit test phía client như [Jest](https://jestjs.io/) hoặc [Mocha](https://mochajs.org/). Cách tiếp cận này cho phép kiểm thử page component JavaScript độc lập bằng Node.js.

## Kiểm thử endpoint

Ngoài kiểm thử page component JavaScript, bạn có thể cũng muốn kiểm thử các response Inertia do framework phía máy chủ trả về. Một cách phổ biến là dùng endpoint test, trong đó bạn gửi request đến ứng dụng và kiểm tra response. Laravel [cung cấp công cụ](https://laravel.com/docs/http-tests) để thực hiện loại test này.

Tuy nhiên, để quá trình này dễ dàng hơn nữa, adapter Laravel của Inertia cung cấp thêm các công cụ HTTP testing. Hãy xem một ví dụ.

```php theme={null}
use Inertia\Testing\AssertableInertia as Assert;
class PodcastsControllerTest extends TestCase
{
public function test_can_view_podcast()
{
$this->get('/podcasts/41')
->assertInertia(fn (Assert $page) => $page
->component('Podcasts/Show')
->has('podcast', fn (Assert $page) => $page
->where('id', $podcast->id)
->where('subject', 'The Laravel Podcast')
->where('description', 'The Laravel Podcast brings you Laravel and PHP development news and discussion.')
->has('seasons', 4)
->has('seasons.4.episodes', 21)
->has('host', fn (Assert $page) => $page
->where('id', 1)
->where('name', 'Matt Stauffer')
)
->has('subscribers', 7, fn (Assert $page) => $page
->where('id', 2)
->where('name', 'Claudio Dekker')
->where('platform', 'Apple Podcasts')
->etc()
->missing('email')
->missing('password')
)
)
);
}
}
```

Như ví dụ trên, bạn có thể dùng các phương thức assertion này để kiểm tra nội dung dữ liệu được truyền vào response Inertia. Ngoài ra, bạn có thể assert dữ liệu mảng có độ dài nhất định cũng như giới hạn phạm vi assertion.

Hãy đi sâu vào các assertion hiện có. Trước tiên, để assert response Inertia có một property, bạn có thể dùng phương thức `has`. Có thể xem phương thức này tương tự hàm `isset` của PHP.

```php theme={null}
$response->assertInertia(fn (Assert $page) => $page
// Checking a root-level property...
->has('podcast')
// Checking nested properties using "dot" notation...
->has('podcast.id')
);
```

Để assert một property Inertia có số lượng item cụ thể, bạn có thể truyền kích thước mong đợi làm đối số thứ hai cho phương thức `has`.

```php theme={null}
$response->assertInertia(fn (Assert $page) => $page
// Checking if a root-level property has 7 items...
->has('podcasts', 7)
// Checking nested properties using "dot" notation...
->has('podcast.subscribers', 7)
);
```

Phương thức `has` cũng có thể được dùng để scope các property, giúp giảm lặp khi assert trên các property lồng nhau.

```php theme={null}
$response->assertInertia(fn (Assert $page) => $page
// Creating a single-level property scope...
->has('message', fn (Assert $page) => $page
// We can now continue chaining methods...
->has('subject')
->has('comments', 5)
// And can even create a deeper scope using "dot" notation...
->has('comments.0', fn (Assert $page) => $page
->has('body')
->has('files', 1)
->has('files.0', fn (Assert $page) => $page
->has('url')
)
)
)
);
```

Khi scope vào các property Inertia là mảng hoặc collection, bạn cũng có thể assert số lượng item cụ thể đồng thời scope vào item đầu tiên.

```php theme={null}
$response->assertInertia(fn (Assert $page) => $page
// Assert that there are 5 comments and automatically scope into the first comment...
->has('comments', 5, fn (Assert $page) => $page
->has('body')
// ...
)
);
```

Để assert một property Inertia có giá trị mong đợi, bạn có thể dùng assertion `where`.

```php theme={null}
$response->assertInertia(fn (Assert $page) => $page
->has('message', fn (Assert $page) => $page
// Assert that the subject prop matches the given message...
->where('subject', 'This is an example message')
// Or, assert against deeply nested values...
->where('comments.0.files.0.name', 'example-attachment.pdf')
)
);
```

Các phương thức testing của Inertia sẽ tự động fail nếu bạn chưa tương tác với ít nhất một prop trong một scope. Điều này nhìn chung hữu ích, nhưng đôi khi bạn làm việc với dữ liệu không ổn định (chẳng hạn từ feed bên ngoài), hoặc có dữ liệu bạn thực sự không muốn tương tác để giữ test đơn giản. Trong các trường hợp đó, hãy dùng phương thức `etc`.

```php theme={null}
$response->assertInertia(fn (Assert $page) => $page
->has('message', fn (Assert $page) => $page
->has('subject')
->has('comments')
->etc()
)
);
```

Phương thức `missing` hoàn toàn đối lập với `has`, dùng để đảm bảo property không tồn tại. Phương thức này kết hợp rất tốt với `etc`.

```php theme={null}
$response->assertInertia(fn (Assert $page) => $page
->has('message', fn (Assert $page) => $page
->has('subject')
->missing('published_at')
->etc()
)
);
```

***

## Tài liệu chính thức

Bài dịch này được đối chiếu từ [tài liệu Inertia.js v1 chính thức](https://inertiajs.com/docs/v1/advanced/testing). Nếu có khác biệt do phiên bản hoặc cập nhật mới, hãy ưu tiên tài liệu chính thức làm nguồn tham chiếu.
