在 laravel 項目中,我們經常需要編寫測試來驗證 FormRequest 的行為。但是,傳統的測試方法往往需要我們提供大量的默認數據,即使我們只關心其中一兩個字段的驗證。這使得測試代碼變得冗長、難以閱讀,并且增加了編寫和維護測試的難度。 Request Factories 庫的出現,完美地解決了這個問題。它允許我們使用工廠模式來生成 FormRequest 的數據,從而簡化測試代碼,提高開發效率。 composer在線學習地址:學習地址問題:繁瑣的 FormRequest 測試
在 laravel 中,formrequest 用于處理 http 請求的驗證和授權邏輯。為了確保 formrequest 的正確性,我們需要編寫測試來驗證各種輸入情況。例如,考慮以下場景:
我們有一個 SignupRequest,用于驗證用戶注冊表單。該表單包含多個字段,如 phone、email、name、company 等。如果我們只想測試 phone 字段的驗證規則,傳統的測試方法需要我們提供所有其他字段的默認值,如下所示:
it('can sign up a user with an international phone number', function () { $this->put('/users', [ 'phone' => '+375 154 767 1088', 'email' => 'foo@bar.com', 'name' => 'Luke Downing', 'company' => 'Worksome', 'bio' => 'Blah blah blah', 'profile_picture' => UploadedFile::fake()->image('luke.png', 200, 200), 'accepts_terms_and_conditions' => true, ]); expect(User::latest()->first()->phone)->toBe('+375 154 767 1088'); });
這段代碼存在以下問題:
- 測試代碼冗長: 為了測試一個字段,我們需要提供所有其他字段的值。
- 測試代碼難以閱讀: 大量的默認數據使得測試代碼難以理解和維護。
- 需要了解 FormRequest 的細節: 為了編寫測試,我們需要了解 FormRequest 中所有字段的驗證規則。
解決方案:使用 Request Factories
worksome/request-factories 庫提供了一種更簡潔、更高效的測試 FormRequest 的方法。它允許我們使用工廠模式來生成 FormRequest 的數據,從而簡化測試代碼,提高開發效率。
安裝
使用 Composer 安裝 worksome/request-factories 庫:
composer require --dev worksome/request-factories
創建 Request Factory
使用 Artisan 命令創建一個 Request Factory:
php artisan make:request-factory "AppHttpRequestsSignupRequest"
這將在 tests/RequestFactories/SignupRequestFactory.php 創建一個新的 Request Factory。
定義 Factory
在 Request Factory 中,我們需要定義一個 definition 方法,該方法返回一個包含默認數據的數組:
namespace TestsRequestFactories; use WorksomeRequestFactoriesRequestFactory; class SignupRequestFactory extends RequestFactory { public function definition(): array { return [ 'phone' => '01234567890', 'email' => 'foo@bar.com', 'name' => 'Luke Downing', 'company' => 'Worksome', 'bio' => $this->faker->words(300, true), 'accepts_terms_and_conditions' => true, ]; } public function files(): array { return [ 'profile_picture' => $this->file()->image('luke.png', 200, 200), ]; } }
使用 Factory 進行測試
現在,我們可以使用 Request Factory 來簡化測試代碼:
it('can sign up a user with an international phone number', function () { SignupRequest::fake(); $this->put('/users', ['phone' => '+375 154 767 1088']); expect(User::latest()->first()->phone)->toBe('+375 154 767 1088'); });
這段代碼更加簡潔、易于閱讀,并且只需要提供我們需要測試的字段的值。
Request Factories 的優勢
- 簡化測試代碼: Request Factories 允許我們使用工廠模式來生成 FormRequest 的數據,從而簡化測試代碼。
- 提高測試效率: Request Factories 減少了編寫測試所需的時間和精力。
- 提高代碼可讀性: 簡潔的測試代碼更容易理解和維護。
- 支持多種測試方法: Request Factories 提供了多種測試方法,可以根據個人喜好選擇。
- 易于集成: Request Factories 可以輕松地集成到現有的 Laravel 項目中。
總結
worksome/request-factories 庫是一個強大的工具,可以幫助我們更簡潔、更高效地測試 Laravel FormRequest。它通過使用工廠模式來生成 FormRequest 的數據,從而簡化測試代碼,提高開發效率。如果你正在尋找一種更高效的測試 FormRequest 的方法,那么 worksome/request-factories 絕對值得一試。