iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
Modern Web

Laravel 8: For Beginners系列 第 10

短網址服務(Part3)

前言

基本上,昨天就已經建構完整個短網址服務(視圖的部份就交給各位完成)。

然而在開發時,還有一件必不可省的事:測試。

測試概論

Laravel 的開發上,測試分為兩大類:Feature Test 及 Unit Test。

官方並沒有很嚴格定義 Feature Test 及 Unit Test 的範圍,我個人習慣遵循以下規則去分類

  • 凡是使用 Laravel 內建功能,都是屬於 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 以使用資料庫
    • 測試時,資料庫會自動執行 Migration
    • 測試時預設會使用 In-memory SQLite
  • 使用 use WithFaker 以使用 $this->faker
  • $response = $this->post($url, $data) 用於模擬 HTTP 請求
  • $this->assertDatabaseHas($table, $data) 用於測試資料庫
    • 它會去確認指定的資料表是否真的有符合條件的資料
  • 註:測試時,對於每個 Test Case 我會使用底線分割的命名方式

模型工廠(Model Factory)

在繼續 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

總結

在這個短網址服務的專案中,我們體驗了如何撰寫一個功能完整的專案。

  • 路由
  • 控制器
  • 驗證
  • 回應(字串回應及 Redirect)
  • 測試
    • HTTP 模擬
    • 模型工廠
    • 資料庫測試
  • 使用簡單的 Laravel 套件

你還可以做的事

  • 設計一個視圖給用戶使用,並且能夠正常顯示縮短後的網址

上一篇
短網址服務(Part2)
下一篇
留言板(Part1)
系列文
Laravel 8: For Beginners14

尚未有邦友留言

立即登入留言