基本上,昨天就已經建構完整個短網址服務(視圖的部份就交給各位完成)。
然而在開發時,還有一件必不可省的事:測試。
Laravel 的開發上,測試分為兩大類:Feature Test 及 Unit Test。
官方並沒有很嚴格定義 Feature Test 及 Unit Test 的範圍,我個人習慣遵循以下規則去分類
本次我們僅會介紹到 Feature Test。
可以利用以下指令建立 PHP Unit 測試稿
$ php artisan make:test ShorterTest
$ php artisan make:test RedirectTest
<?php
// tests/Feature/ShorterTest.php
// ...
class ShorterTest extends TestCase
{
use RefreshDatabase;
use WithFaker;
public function test_shorter()
{
$response = $this->post(route('shorter'), [
'url' => $url = $this->faker->url,
]);
$response->assertSuccessful();
$this->assertDatabaseHas('urls', ['url' => $url]);
}
}
use RefreshDatabase
以使用資料庫
use WithFaker
以使用 $this->faker
$response = $this->post($url, $data)
用於模擬 HTTP 請求
$this->assertDatabaseHas($table, $data)
用於測試資料庫
在繼續 RedirectTest
之前,要先介紹「模型工廠」這個功能。利用它,可以輕鬆地建立測試時期的資料。
$ php artisan make:factory UrlFactory --model=Url
建立出來的 UrlFactory
位於 database/factories
之中,內容大致如下(省略註解)
<?php
// database/factories/UrlFactory.php
// ...
class UrlFactory extends Factory
{
protected $model = Url::class;
public function definition()
{
return [
'url' => $this->faker->url,
];
}
}
<?php
// tests/Feature/RedirectTest.php
// ...
class RedirectTest extends TestCase
{
use RefreshDatabase;
public function test_redirect()
{
$url = Url::factory()->create();
$response = $this->get(route('redirector', ['url' => Hashids::encode($url->id)]));
$response->assertRedirect($url->url);
}
}
最後,利用 php artisan test
即可執行測試
$ php artisan test
PASS Tests\Feature\RedirectTest
✓ redirect
PASS Tests\Feature\ShorterTest
✓ shorter
Tests: 2 passed
Time: 0.29s
在這個短網址服務的專案中,我們體驗了如何撰寫一個功能完整的專案。