Test HTTP trong Laravel

Giới thiệu

Laravel cung cấp API rất dễ dàng để tao các HTTP request cho ứng dụng của bạn và kiểm tra đầu ra. Ví dụ, nhìn vào đoạn test nổi bât bên dưới:

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

Phương thức get tạo 1 GET request đến úng dụng, trong khi phương thức assertStatus xác nhận rằng phản hồi được trả về nên nhận được HTTP status code. Ngoài việc xác nhận đơn giản này, Laravel cũng chứa các xác nhận đa dạng cho việc kiểm tra các response headers, nội dung, cấu trúc JSON.

Tùy chỉnh các request header

Bạn có thể sử dụng phương thức withHeaders để tùy chỉnh các requests header trước khi nó gửi đến ứng dụng. Điều nay cho phép bạn thêm bất kỳ tùy chỉnh header nào mà bạn muốn đến request:


<?php

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->withHeaders([
            'X-Header' => 'Value',
        ])->json('POST', '/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertJson([
                'created' => true,
            ]);
    }
}

Cookies

Bạn có thể sử dụng phương thức withCookie hoăc withCookies để đặt giá trị cho cookie trước khi tạo request. Phương thức withcookie chấp nhận tên cookie và giá tri như là 2 đối số, trong hi phương thức withcookies chấp nhận 1 mảng cặp của tên / giá trị.

<?php

class ExampleTest extends TestCase
{
    public function testCookies()
    {
        $response = $this->withCookie('color', 'blue')->get('/');

        $response = $this->withCookies([
            'color' => 'blue',
            'name' => 'Taylor',
        ])->get('/');
    }
}

Debugging Responses

Sau khi tạo 1 request đến ứng dụng, các phương thức dump, dumpHeaders và dumpSession có thể đươc sử dụng để kiểm tra và debug các nội dung của response:


<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->dumpHeaders();

        $response->dumpSession();

        $response->dump();
    }
}

Session / Authentication

Laravel cung cấp 1 vài sư trợ giúp cho khi làm việc với session trong khi kiểm tra HTTP. Đầu tiên, bạn có thể đặt dữ liệu session thành mảng sử dụng phương thức withSession. Điều này hữu ích cho việc tải session với dữ liệu trước khi
đưa 1 request vào ứng dung của bạn:


<?php

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $response = $this->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

Session thường được sử dụng để duy trì trạng thái xác thực của người dùng. Phương thức actingAs cung cấp 1 cách đơn giản để xác thực 1 người dùng được nhận vào như là người dùng hiện tại. Ví dụn, chúng ta sử dụng 1 model factory để sinh ra và xác thực người dùng:


<?php

use App\User;

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = factory(User::class)->create();

        $response = $this->actingAs($user)
                         ->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

Bạn cũng có thể chỉ định loại bảo vệ nào được sử dụng để xác thực người dùng được đưa vào bằng cách truyền vào tên loại bảo vệ ở đối số thứ 2 của phương thức actingAs:

$this->actingAs($user, 'api')

Kiểm tra các JSON API

Laravel cung cấp 1 vài cách kiểm tra JSON API và response của chúng. Ví dụ, json, getJson, postJson, putJson, patchJson, deleteJson, and optionsJson có thể được sử dụng để tạo ra các JSON request với đa dạng các HTTP verb. Bạn cũng có thể dễ dàng truyền dữ liệu và headers đến các phương thức đó. Để bắt đầu, hãy viết 1 đoạn test để tạo ra 1 POST request đến /user và xác nhận bằng dữ liệu được mong đợi trả về:

<?php

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->postJson('/user', ['name' => 'Sally']);

        $response
            ->assertStatus(201)
            ->assertJson([
                'created' => true,
            ]);
    }
}

Phương thức assertJson chuyển kết quả trả về thành 1 mảng và tận dụng PHPUnit::assertArraySubset để xác nhận rằng mảng trả về có tòn tại trong JSON response được trả về bởi úng dụng. Vì vậy, nếu có các thuộc tính khác trong kết quả trả về JSON đoạn test đó vẫn pass miễn là mảng đã cho có mặt.