تست کردن حالتهای مختلف اعتبارسنجی ورودی

برای اینکه از درست بودن ورودی کاربر مطمئن شوید باید در تست Enpoint ها برای حالات مختلف غلط بودن ورودی ها رو شبیه سازی کنید تا بتونید پیام خطای متناسب هر کدوم رو تست کنید.

در پست قبل، از اینکه FormRequest ها در لاراول چقدر میتونند برای سهولت پیاده سازی Validation به ما کمک کنند توضیح دادم. برای تست انجام صحیح یک ریکوئست (happy path) میتونید ورودی ها رو کامل کنید و تست بگیرید:

$this->post('/api/users', [
    'email' => '[email protected]',
    'password' => '12345678'
    ])->assertJson('you have successfully registered for');

اما برای تست کردن حالت های مختلف ورودی باید:

$this->post('/api/users', ['email' => gmail.com])->assertJson('your email is not valid');

و سپس تست دیگری برای فیلد دوم با خطای مشخص آن:

$this->post('/api/users', ['password' => gmail.com])->assertJson('password must be at least 8 character');

و علاوه بر حالات دیگر، باید ترکیب این خطاها نیز تست شود که بسیار وقت گیر و غیرقابل کنترل خواهد بود.

اما راه حل بهتر اینه که شما بجای تست Endpoint خود FormRequest رو تست کنید برای این کار یه تست مخصوص اون فرم ایجاد کنید:

class StoreUserTest extends TestCase {     
private $subject;      
protected function setUp(): void {         
parent::setUp();          
$this->subject = new StoreUserRequest();     
}      
public function testRules() {         
$this->assertEquals([                 
    'name' => 'required',                 
    'email' => 'required|email'            
    ],             
    $this->subject->rules()         
    ); } 
    public function testAuthorize() {         
    $this->assertTrue($this->subject->authorize());     
    } }

حالا شما برای پاس کردن این تست فقط کافیه تا FormRequest ای شبیه با قوانین این تست بسازید. و هر در پیاده سازی تغییری ایجاد شد کافیه تا تست ها رو تغییر بدهید.