Laravel is a full-stack framework that has many components, from routing, to middlewares, to views. Manually testing each of these components is very stressful and not very efficient. Laravel provides an easy way to test our application. Laravel’s feature tests let you make HTTP requests to your application and examine the response.
To get started, use the laravel
installer to create a Laravel application.
laravel new testy
Now, the application bootstraps with a test directory that has the Feature
and Unit
sub-directories. In this shot, we will create a feature test to examine our application’s views.
Next, you want to create a basic view to list users of the application. For this view to list users, you must have users on your application.
To retrieve users, update the DatabaseSeeder.php
seeder file’s run
method to contain the following:
User::factory(20)->create();
This creates 20 fake users when run.
php artisan db:seed
web.php
file to fetch all users and pass them to the view.Route::get('/', function () {
return view('welcome')->with('users', User::all());
});
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<table>
<caption>Users</caption>
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Name</th>
<th scope="col">Email</th>
</tr>
</thead>
<tbody>
@forelse($users as $user)
<tr>
<th scope="row">{{ $user->id }}</th>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
</tr>
@empty
<p>No registered user</p>
@endforelse
</tbody>
</table>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-/bQdsTh/da6pkI1MST/rWKFNjaCP5gBSY4sEBT38Q/9RBh9AH40zEOg7Hlq2THRZ" crossorigin="anonymous"></script>
</body>
</html>
php artisan make:test
to create a feature test.php artisan make:test UsersTest
Here, we create a test named UsersTest
. This creates a new file, UsersTest.php
, in the tests/Feature
directory.
Now, we need to update the test to match our needs. The test methods are usually named as test_
, followed by the action name. So, in this case, rename it to test_users_list
.
Notice how the application makes a get request to /
by default and checks if the response status is 200
.
The assertStatus
method is used to check if the response code matches a given code.
To check if the response matches 200 exactly, you can use the assertOk
method instead.
To check if a given text is on the page, i.e., to see if a user is listed, use assertSee
.
$response = $this->get('/');
$user = User::first();
$response->assertSee($user->name);
assertDontSee
.$response->assertDontSee('Alfred');
assertViewHas
to check if data is passed into the view.$response->assertViewHas('users', User::all());
assertViewIs
.$response->assertViewIs('welcome');
Laravel has many more methods to test database actions and API responses. To run these tests, run the following code in the terminal:
php artisan test