Unit test in Laravel 5.4

1. Giới thiệu về unit test Laravel 5.4

Hôm nay mình sẽ giới thiệu về unit test ở Laravel phiên bản 5.4. Như các bạn đã biết thì unit test rất quan trọng trong quá trình phát triển sản phẩm, việc vì sao nó quan trọng thì mình sẽ không giải thích nữa nhé =)). Tuy nhiên ở phiển bản 5.4 này thì unit test có một số thay đổi so với phiên bản 5.3. Cụ thể thì ở phiên bản 5.4 chúng ta sẽ có các mục :

HTTP Tests Browser Tests Database Mocking

Và sau đây chúng ta khám phá từng phần

2. HTTP Tests

Ở mục HTTP Tests Laravel hỗ trợ chúng ta việc test

Session / Authentication Testing JSON APIs Testing File Uploads Available Assertions

Phần Session / Authentication chúng ta có thể gán session khi gửi đi một request hoặc có thể gán cùng khi tạo một xác thực người dùng, tức là bạn sẽ facker một user và gán xác thực user bạn mới tạo ra.

$user = factory(User::class)->create();
$this->actingAs($user, 'api');

Tiếp theo chúng ta hãy thử với một bài toán nhỏ. Đầu tiền tạo một CommentController

class CommentController extends Controller
{
    public function store(Request $request)
    {
        $comment = Comment::create($request->all());
        $comment->user()->attach($comment->id, ['user_id' => auth()->id()]);
        
        return response()->json(['status' => 'OK']);
    }
}

Vậy tiếp tục với đoạn test phía trên chúng ta hãy test cho controller này nào.

$user = factory(User::class)->create();
$this->actingAs($user, 'api')->withSession(['_token' => \Session::token()]);

$response = $this->json('POST', 'your_url', [
    'content' => 'This is my comment',
]);

$response->assertStatus(200)
    ->assertJson([
        'status' => "OKE",
    ]);

Như vậy chúng ta có thể chứng thực được kết quả trả về khi request lên server. Tương tự, khi chúng ta upload file. Và phần Available Assertions cung cấp cho chúng ta các hàm để xác thực kết quả chúng ta mong đợi khi trả về. Ở đây chúng ta sẽ quan tâm đến các hàm chủ yếu như

$response->assertStatus($code);
$response->assertRedirect($uri);
$response->assertHeader($headerName, $value = null);
$response->assertJson(array $data);
$response->assertExactJson(array $data);

3. Browser Tests

Ở phần này laravel hỗ trợ chúng ta test với trình duyệt nhưng mà dài quá nên mình sẽ để link thôi nhà =)) https://laravel.com/docs/5.4/dusk

4. Database

Ở phần này cũng khá quan trọng trong việc test. Giả dụ nếu bạn chạy test mà không muốn dữ liệu lưu vào database hoặc bạn test một function create user do bạn chỉ định như :

$response = $this->json('POST', 'create/user', [
    'email' => '[email protected]',
    ....
]);

Nếu bạn không dùng facker thì test này sẽ fail ở lần chạy thứ 2 vì trường email trong databse là unique. Để giải quyết vấn đề này, laravel cung cấp cho bạn các phương thức thao tác với database khi viết test.

use DatabaseMigrations; use DatabaseTransactions;

Bạn chỉ việc use cái nào bạn cần rồi chạy test thôi 😃) Việc còn lại cứ để laravel lo. Và chúng ta cũng có thể facker dữ liệu nếu như các bạn đã viết facker

$user = factory(App\User::class)->make();

Lệnh make sẽ chỉ fake một user ảo mà không có id. tức là user này sẽ không tồn tại trong database.

$user = factory(App\User::class)->create();

Lệnh create sẽ thực hiện fake một user và cái này sẽ có trong database :v Tất nhiên là chúng ta cũng sẽ có các phương thức để chứng thực như:

$this->assertDatabaseHas($table, array $data); $this->assertDatabaseMissing($table, array $data); $this->assertSoftDeleted($table, array $data);

Chúng ta cũng có thể mocking queue, email v.v... và còn rất nhiều cách test khác nhau nữa. Trên đây là một vài điều tổng quan về unit test ở laravel. À mà quên có thể bạn chưa biết, nếu bạn chưa cài phpunit thì để chạy được unit test bạn phải chạy lênhj vendor/bin/phpunit (yaoming)


All Rights Reserved