12/08/2018, 15:42

HTTP Tests trong Laravel

1. Giới thiệu Laravel cung cấp 1 fluent API để thực hiện các HTTP requests cùng với kiểm tra đầu ra của các requests cho ứng dụng của bạn. Chúng ta thử test trường hợp access vào route '/': public function testBasicTest() { // check access vào route / có trả về HTTP status code là 200 hay ...

1. Giới thiệu

Laravel cung cấp 1 fluent API để thực hiện các HTTP requests cùng với kiểm tra đầu ra của các requests cho ứng dụng của bạn. Chúng ta thử test trường hợp access vào route '/':

public function testBasicTest()
{
    // check access vào route / có trả về HTTP status code là 200 hay ko.
    $response = $this->get('/');
    $response->assertStatus(200);
}

2. Session / Authentication

Laravel cung cấp một số helpers để làm việc với sessions trong quá trình kiểm thử HTTP. Bạn có thể thiết lập một mảng session bằng method withSession(). Việc này rất hữu dụng để load dữ liệu session trước khi thực hiện HTTP requests.

<?php

use AppUser;

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = factory(User::class)->create();
        
        // Truy cập đến đường dẫn / với session foo => bar dưới vai trò là user $useruser
        $response = $this->actingAs($user)
                         ->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

3. Testing JSON APIs

Laravel cũng cung cấp một số helpers để kiểm thử các JSON APIs và các response của chúng. Ví dụ, các phương thức json, get, post, put, patch, và delete có thể được sử dụng để thực hiện các requests với các động từ HTTP khác nhau. Bạn cũng có thể dễ dàng truyền dữ liệu và header đến các method này.

<?php

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        // Truyền dữ liệu name = Sally đến url /user qua phương thức POST
        $response = $this->json('POST', '/user', ['name' => 'Sally']);
           
        // Xác nhận response trả về có match với created => true hay không
        $response->assertStatus(200)
                 ->assertExactJson([
                    'created' => true,
                 ]);
    }
}

4. Testing File Uploads

Class IlluminateHttpUploadedFile cung cấp các methods dùng để fake ra các files hoặc images cho việc kiểm thử. Kết hợp với Storage facades, việc kiểm thử upload files trở nên dễ dàng hơn.

<?php

namespace TestsFeature;

use TestsTestCase;
use IlluminateHttpUploadedFile;
use IlluminateSupportFacadesStorage;
use IlluminateFoundationTestingWithoutMiddleware;
use IlluminateFoundationTestingDatabaseMigrations;
use IlluminateFoundationTestingDatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testAvatarUpload()
    {
        // fake storage disk tên là avatars
        Storage::fake('avatars');
        
        // truyền ảnh avatar đến url avatar với method POST
        $response = $this->json('POST', '/avatar', [
            'avatar' => UploadedFile::fake()->image('avatar.jpg')
        ]);

        // Xác nhận có tồn tại file avatar.jpg
        Storage::disk('avatars')->assertExists('avatar.jpg');

        // Xác nhận không tồn tại file missing.jpg
        Storage::disk('avatars')->assertMissing('missing.jpg');
    }
}

5. Các Assertions khả dụng

Laravel cung cấp rất nhiều 'xác nhận' mà bạn có thể sử dụng để chạy unittest 1 cách dễ dàng

Assertions Description
response−>assertStatus(response->assertStatus(response>assertStatus(code) Xác nhận trả về status code $$ode
response−>assertRedirect(response->assertRedirect(response>assertRedirect(uri) Xác nhận chuển hướng đến url $$ri
response−>assertHeader(response->assertHeader(response>assertHeader(headerName, $$alue = null) Xác nhận response trả về có chứa header $$eaderName
response−>assertCookie(response->assertCookie(response>assertCookie(cookieName, $$alue = null) Xác nhận có chứa cookie $$ookieName
response−>assertPlainCookie(response->assertPlainCookie(response>assertPlainCookie(cookieName, $$alue = null) Xác nhận có chứa cookie $$ookieName không được mã hóa
response−>assertSessionHas(response->assertSessionHas(response>assertSessionHas(key, $$alue = null) Xác nhận session có chứa key $$ey
response−>assertSessionHasErrors(arrayresponse->assertSessionHasErrors(array response>assertSessionHasErrors(arraykeys) Xác nhận session có chứa lỗi cho field $$ey
response−>assertSessionMissing(response->assertSessionMissing(response>assertSessionMissing(key) Xác nhận session không chứa key $$ey
response−>assertJson(arrayresponse->assertJson(array response>assertJson(arraydata) Xác nhận response json trả về có chứa mảng $$ata.
response−>assertJsonFragment(arrayresponse->assertJsonFragment(array response>assertJsonFragment(arraydata) Xác nhận resonse json fragment trả về có chứa mảng $$ata
response−>assertJsonMissing(arrayresponse->assertJsonMissing(array response>assertJsonMissing(arraydata) Xác nhận response json trả về không chứa mảng $$ata.
response−>assertExactJson(arrayresponse->assertExactJson(array response>assertExactJson(arraydata) Xác nhận response json trả về trùng khớp với mảng $$ata
response−>assertJsonStructure(arrayresponse->assertJsonStructure(array response>assertJsonStructure(arraystructure) Xác nhận response trả về có cấu trúc json
response−>assertViewIs(response->assertViewIs(response>assertViewIs(value) Xác nhận response trả về view $$alue
response−>assertViewHas(response->assertViewHas(response>assertViewHas(key, $$alue = null) Xác nhận response trả về view có chứa key $$ey.

Các bạn có thể tìm hiểu thêm ở documents của Laravel: https://laravel.com/docs/5.4/http-tests

0