آموزش Http Tests در لاراول

  ‏سطح پیشرفته
‏  41 دقیقه
۰۵ دی ۱۳۹۹
آموزش Http Tests در لاراول

از زمانی که تست نویسی به عنوان یک بخش جدایی ناپذیر از توسعه‌ی اپلیکیشن شناخته شد، زمان زیادی نمی‌گذرد. تست‌ها باید وجود داشته باشند تا بتوانید با اعتمادبه‌نفس کدهای قبلی را تغییر دهید. با استفاده از تست، نه تنها این اعتماد بنفس در توسعه دهنده ایجاد می‌شود، بلکه مهارت‌های برنامه نویسی او افزایش می‌یابد.

برخلاف اهمیت روزافزون تست نویسی، آمارها نشان می‌دهند که کمتر از یک چهارم اپلیکیشن‌های لاراول موجود، تست شده‌اند. دلیل عمده‌ی این آمار پایین، معمولا این نکته است که توسعه دهندگان لاراول نمی‌دانند چگونه و از کجا تست نویسی را در اپلیکیشن خود شروع کنند. ما در این مقاله قصد داریم پاسخ این پرسش را بررسی کنیم و تست نویسی در لاراول را با هم بیاموزیم. پس تا انتهای مقاله‌ی Http Tests در لاراول با ما همراه باشید.

فهرست محتوای این مقاله

تست نویسی در لاراول را چگونه شروع کنیم؟

جواب ساده است. از Http Test شروع کنید. با استفاده از Http Test، به سادگی می‌توانید هرگونه درخواست GET،POST ،PUT و... را ایجاد کنید. شما می‌توانید هرگونه اطلاعاتی، اعم از احراز هویت کاربر، اطلاعات فرم و هم‌چنین مقادیر سشن و هدر را با استفاده از یک API مشخص، ارسال کنید.

رفتار Object مربوط به پاسخی که برمی‌گردد را می‌توان با استفاده از متدهای Assertion بررسی کرد. می‌توان Http Status، View برگشتی، اطلاعات سشن و هدر و یا Redirect به صفحات دیگر را بررسی نمود.

Http Testها آسان‌ترین راه برای ارسال درخواست به اپلیکیشن و بررسی پاسخ برگشتی هستند و توسعه دهندگان با استفاده از آن‌ها، برای بخش‌های مختلف اپلیکیشن خود مانند Middlewares، کنترلرها، مدل‌ها، سرویس‌ها و ویوها، تست‌های کاربردی می‌نویسند. تست نویسی، سرمایه‌ی زمانی پروژه‌تان را در انتهای پروژه، زمانی که نیاز به دیباگ و بررسی بخش‌های مختلف اپلیکیشن دارید، به طور کامل برمی‌گرداند.

شروع تست نویسی در لاراول

تست نویسی در لاراول را از یک درخواست Http شروع کنید که یک پاسخ بسیار ساده را برمی‌گرداند. به عنوان توسعه دهنده‌ی لاراول، ممکن است ترغیب شوید که تست نویسی را از بخش‌های پیچیده‌ی اپلیکیشن شروع کنید؛ ولی این کار ممکن است باعث شود که به زودی از تست نویسی خسته شده و آن را در نیمه‌ی راه، رها کنید. به یاد داشته باشید که تست نویسی باید یک فرآیند قدم به قدم، از قدم‌های کوچک‌تر به قدم‌های بزرگ‌تر باشد.

پیش‌نیازها

برای شروع یادگیری Http Testing در لاراول، به دانش کافی در زمینه‌ی لاراول نیاز دارید.

توضیحات پروژه

در این مقاله قصد داریم بخش ثبت نام و احراز هویت پروژه‌ی لاراول خود را ایجاد کرده و با استفاده از Http Tests، آن را تست کنیم.

نصب پروژه

ابتدا یک پروژه‌ی جدید لاراول را ایجاد می‌کنیم. برای این منظور دستور زیر را در مسیر دلخواه خود اجرا کنید:

composer create-project --prefer-dist laravel/laravel testing-laravel

سپس با دستور زیر وارد پوشه‌ی پروژه‌ای که ایجاد کرده‌اید، شوید:

cd testing-laravel

سپس دستور زیر را اجرا کنید:

php artisan serve

پس از اجرای این دستور، پروژه بر روی پورت 8000 لوکال هاست در دسترس است. با وارد کردن آدرس http://localhost:8000 در نوار آدرس مرورگر، با این صفحه مواجه می‌شوید:

Http Testing در لاراول

برقراری ارتباط با دیتابیس

قدم بعدی، برقراری ارتباط با دیتابیس است. ابتدا یک دیتابیس دلخواه را ایجاد کنید و سپس مقادیر متغیرهای زیر را در فایل env. پروژه به‌روز کنید:

DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

ایجاد جداول

با استفاده از دستور زیر، جداول پیش‌فرض لاراول را ایجاد کنید:

php artisan migrate

مسیرها

حال نوبت آن رسیده است که مسیرهای مورد نظر خود را ایجاد کنیم. به پوشه‌ی routes و فایل web.php مراجعه کنید و سه مسیر زیر را برای احراز هویت و ثبت نام کاربران تعریف کنید:

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
})->name('index');

Route::get('/login', [\App\Http\Controllers\AuthController::class, 'login'])->name('login');
Route::post('/login', [\App\Http\Controllers\AuthController::class, 'doLogin'])->name('doLogin');
Route::get('/register', [\App\Http\Controllers\AuthController::class, 'register'])->name('register');
Route::post('/register', [\App\Http\Controllers\AuthController::class, 'doRegister'])->name('doRegister');

ایجاد View

اکنون قالب Blade مربوط به صفحه‌ی ورود کاربران را در مسیر resources/views/auth و با نام login.blade.php ایجاد می‌کنیم:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Login</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
    <link rel="stylesheet" href="{{ asset('css/style.css') }}">
</head>

<body>
<div id="login">
    <h3 class="text-center text-white pt-5">Login form</h3>
    <div class="container">
        <div id="login-row" class="row justify-content-center align-items-center">
            <div id="login-column" class="col-md-6">
                <div id="login-box" class="col-md-12">
                    <form id="login-form" class="form" action="{{ route('doLogin') }}" method="post">
                        {{ csrf_field() }}
                        <h3 class="text-center text-info">Login</h3>
                        <div class="form-group">
                            <label for="email" class="text-info">Email:</label><br>
                            <input type="email" name="email" id="email" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="password" class="text-info">Password:</label><br>
                            <input type="password" name="password" id="password" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="remember_me" class="text-info"><span>Remember me</span> <span><input
                                        id="remember_me" name="remember_me" type="checkbox"></span></label><br>
                            <input type="submit" name="submit" class="btn btn-info btn-md" value="submit">
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</body>
</html>

سپس قالب Blade مربوط به ثبت نام کاربران را در همان مسیر و با نام register.blade.php ایجاد می‌کنیم:

<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Register</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
    <link rel="stylesheet" href="{{ asset('css/style.css') }}">
</head>

<body>
<div id="login">
    <h3 class="text-center text-white pt-5">Register form</h3>
    <div class="container">
        <div id="login-row" class="row justify-content-center align-items-center">
            <div id="login-column" class="col-md-6">
                <div id="login-box" class="col-md-12">
                    <form id="login-form" class="form" action="{{ route('doRegister') }}" method="post">
                        {{ csrf_field() }}
                        <h3 class="text-center text-info">Register</h3>
                        <div class="form-group">
                            <label for="name" class="text-info">Name:</label><br>
                            <input type="text" name="name" id="name" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="email" class="text-info">Email:</label><br>
                            <input type="email" name="email" id="email" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="password" class="text-info">Password:</label><br>
                            <input type="password" name="password" id="password" class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="password_confirmation" class="text-info">Confirm Password:</label><br>
                            <input type="password" name="password_confirmation" id="password_confirmation" class="form-control">
                        </div>
                        <div class="form-group">
                            <input type="submit" name="submit" class="btn btn-info btn-md" value="submit">
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</body>
</html>

کدهای CSS

در مسیر public/css یک فایل CSS با نام style.css ایجاد کنید و کدهای زیر را در آن کپی کنید:

body {
    margin: 0;
    padding: 0;
    background-color: #17a2b8;
    height: 100vh;
}

#login .container #login-row #login-column #login-box {
    margin: 50px auto;
    max-width: 600px;
    height: auto;
    border: 1px solid #9C9C9C;
    background-color: #EAEAEA;
}

#login .container #login-row #login-column #login-box #login-form {
    padding: 20px;
}

#login .container #login-row #login-column #login-box #login-form #register-link {
    margin-top: -85px;
}

ایجاد کنترلر

با استفاده از دستور زیر کنترلر AuthController را ایجاد می‌کنیم:

php artisan make:controller AuthController

سپس سه متد login ،doLogin و logout را در کنترلر ایجاد شده، تعریف می‌کنیم:

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class AuthController extends Controller
{
    public function login()
    {
        return view('auth.login');
    }
    
    public function doLogin(Request $request)
    {
        $this->validate($request, [
            'email' => 'required',
            'password' => 'required'
        ]);
    
        $data = $request->only('email', 'password');
        $rememberMe = $request->input('remember_me');
        if (auth()->attempt($data, $rememberMe))
            return redirect()->route('index');
        else
            return redirect()->back()->withErrors('Either email or password is wrong.');
    }

    public function register()
    {
        return view('auth.register');
    }

    public function doRegister(Request $request)
    {
        $data = $request->all();
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed'
        ]);
        $data['password'] = bcrypt($request->password);
        $user = User::create($data);
        auth()->login($user);
        return redirect()->route('index');
    }
}

متد login برای نمایش صفحه‌ی ورود، متد doLogin برای احراز هویت کاربر و متد logout برای حذف سشن و خروج کاربر، مورد استفاده قرار می‌گیرند.

اجرای تست

لاراول به صورت پیش‌فرض، محیط تستی را در اختیار توسعه‌دهندگان قرار داده است که دو تست نمونه را هم شامل می‌شود. این محیط از فریم‌ورک تست نویسی PHPUnit که ویژه‌ی زبان PHP است، استفاده می‌کند. برای اجرای تست‌ها، می‌توان به وسیله‌ی دستور زیر، Test Runner مربوط به PHPUnit را صدا زد:

vendor/bin/phpunit

با اجرای دستور فوق، دو تست نمونه‌‌ای که به صورت پیش‌فرض در لاراول تعریف شده اند، اجرا می‌شوند. پیام موفقیت‌آمیز بودن تست‌ها را در پایین ملاحظه می‌کنید:

Http Testing در لاراول

انواع تست‌ها

لاراول تست‌ها را در پوشه‌ی tests ذخیره می‌کند. در این پوشه، دو پوشه‌ی دیگر داریم: feature و unit.

یکی از مواردی که ممکن است در ابتدای تست نویسی در لاراول، شما را سردرگم کند، همین مساله است که از کدام یک از این دو نوع تست استفاده کنید.

Unit Testها برای تست بخش‌های کوچک و ایزوله‌ی اپلیکیشن مورد استفاده قرار می‌گیرند. معمولا بیشتر Unit Testها فقط یک متد خاص را دربرمی‌گیرند. تست‌های موجود در پوشه‌ی unit، اپلیکیشن را Boot (راه‌اندازی) نمی‌کنند؛ درنتیجه، نمی‌توانند به دیتابیس و یا سایر سرویس‌های اپلیکیشن دسترسی داشته باشند.

در سمت مقابل، Feature Testها، بخش بزرگتری از کد را تست می‌کنند و معمولا اکثر تست‌های ایجاد شده در یک اپلیکیشن لاراول، از این نوع هستند.

در این‌جا، ما تمام تست‌ها را از نوع Feature ایجاد می‌کنیم.

ساماندهی تست‌ها

یکی از روش‌های پیشنهادی برای ساختار پوشه‌های تست‌ها، استفاده از همان ساختار پوشه‌ی app است. در این روش، اگر قصد دارید که یک کلاس تست را برای کنترلر app/Http/Controllers/UserController.php ایجاد کنید، آن را به شکل tests/Feature/Http/Controllers/UserControllerTest.php ایجاد کنید. استفاده از این روش، باعث می‌شود که مطمئن شوید برای قسمت‌های مختلف اپلیکیشن، تست ایجاد کرده‌اید و هم‌چنین پیدا کردن تست‌ها هم برایتان ساده‌تر می‌شود.

ایجاد تست

ابتدا با یک تست ساده شروع می‌کنیم. برای مثال، می‌توانیم صفحه‌ی اصلی یا صفحه‌ی ورود را تست کنیم. با استفاده از دستور زیر یک کلاس تست را برای AuthController ایجاد می‌کنیم:

php artisan make:test Http/Controllers/AuthControllerTest

ایجاد Unit Test

تست فوق، در پوشه‌ی feature ایجاد می‌شود. برای ایجاد تست Unit باید به صورت زیر عمل کنید:

php artisan make:test Http/Controllers/AuthControllerTest  --unit

بررسی تست

هر فایل PHP موجود در پوشه‌های feature و unit که در انتهای نامش، کلمه‌ی Test آمده باشد، به طور خودکار، به وسیله‌ی PHPUnit اجرا می‌شود. برای تغییر این تنظیمات می‌توانید به فایل phpunit.xml مراجعه کنید. دستور فوق، کلاس زیر را در مسیر مشخص شده، ایجاد می‌کند:

<?php

namespace Tests\Feature\Http\Controllers;

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

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

        $response->assertStatus(200);
    }
}

در این‌جا باید به چند نکته اشاره کنیم. این کلاس، کلاس TestCase را Extend می‌کند. کلاس نام‌برده در پوشه‌ی tests قرار دارد و می‌توانید کدهای خود را برای استفاده در کلاس‌های تست ایجاد شده، به آن اضافه کنید. این کلاس، همچنین کلاس BaseTestCase لاراول را Extend می‌کند که توابع کمکی را برای استفاده در اختیار شما قرار می‌دهد.

یک متد نمونه نیز به صورت پیش‌فرض به همراه کلاس، ایجاد شده است.

هم‌چنین، هر متدی که به صورت public و با پیشوند test در کلاس تست ایجاد شده، تعریف شود، توسط PHPUnit اجرا می‌شود. علاوه بر این، با استفاده از حاشیه نویسی (annotation) به صورت test@ نیز می‌توانید یک متد تست را مشخص کنید. استفاده از این حاشیه نویسی به همراه شیوه‌ی نام‌گذاری snake case، برای تست نویسی در لاراول بسیار رایج است.

تست اول

برای اولین مورد، قصد داریم مطمئن شویم که با مراجعه به آدرس /login، صفحه‌ی ورود نمایش داده می‌شود. بنابراین هدف تست موردنظرمان، به این شکل است:

نکته :

زمانی که یک درخواست GET را به مسیر login ارسال می‌کنیم، فایل View باید با نام auth.login نمایش داده شود.

بنابراین متد زیر را در کلاس تستی که ایجاد کردیم، تعریف می‌کنیم:

/** @test */
public function login_displays_the_login_form()
{
    $response = $this->get(route('login'));

    $response->assertStatus(200);
    $response->assertViewIs('auth.login');
}

در متد فوق ابتدا درخواست GET را تعریف کرده و سپس، دو متد Assertion با نام‌های assertStatus برای مشخص کردن Http Status مورد نظر و assertViewIs برای مشخص کردن View موردنظر را استفاده کرده‌ایم. لاراول متدهای Assertion زیادی را برای استفاده هنگام تست اپلیکیشن، در دسترس توسعه‌دهندگان قرار داده است. این Assertionها را می‌توان بر روی پاسخ برگشتی از متدهای تست json ،get ،post ،put و delete صدا زد. لیست این متدها را می‌توانید در صفحه‌ی Http Tests در وب‌سایت رسمی لاراول مشاهده کنید.

نام متد فوق نیز براساس الگوی snake case نوشته شده است. استفاده از این الگو و توضیح راجع به هدف متد در نام‌گذاری، زمانی به کارمان می‌آید که هنگام اجرای تست، به اخطار برمی‌خوریم. با مشاهده‌ی نام متدی که اخطار در آن رخ داده، به سادگی می‌توانیم دلیل بروز اخطار را متوجه شویم.

اجرای تست اول

اکنون برای اجرای تست فوق از دستور زیر استفاده می‌کنیم:

vendor/bin/phpunit tests/Feature/Http/Controllers/AuthControllerTest.php

همان‌طور که می‌بینید، می‌توانیم اجرای تست را فقط به کلاس تستی که ایجاد کرده‌ایم، محدود کنیم. در صورت اجرای موفقیت‌آمیز تست، با پیام زیر روبرو می‌شوید:

Http Testing در لاراول

تست دوم

اکنون می‌توانیم تست مربوط به ورود ناموفق کاربر را تعریف کنیم. در این مرحله باید هدف تست را تعریف کنیم:

نکته :

زمانی که یک درخواست POST را با اطلاعات نادرست به آدرس /login ارسال می‌کنیم، باید به صفحه‌ی ورود Redirect شویم و یک اخطار اعتبارسنجی یا Validation Error دریافت کنیم.

بنابراین متد زیر را در کلاس AuthControllerTest، تعریف می‌کنیم:

/** @test */
public function login_displays_validation_errors()
{
    $response = $this->post('/login', []);

    $response->assertStatus(302);
    $response->assertSessionHasErrors('email');
}

همان‌طور که در متد فوق می‌بینید، ابتدا با استفاده از متد post، یک درخواست را به آدرس /login ارسال می‌کنیم. سپس با استفاده از متد assertStatus، وضعیت 302 را که مربوط به اخطار اعتبارسنجی است مشخص می‌کنیم. پس از آن با استفاده از متد assertSessionHasErrors، نوع اخطار برگشتی را که در سشن ذخیره شده است، مشخص می‌کنیم.

تست سوم

اکنون تست مربوط به ورود موفق کاربر را تعریف می‌کنیم. برای این منظور ابتدا نیاز داریم تا یک Model Factory ایجاد کنیم. در لاراول به صورت پیش‌فرض، یک Model Factory برای مدل User، در مسیر database/factories وجود دارد. ما از Model Factoryها در تست نویسی استفاده می‌کنیم تا با ایجاد داده‌های تصادفی در جداول، بتوانیم قسمت‌هایی از اپلیکیشن را که نیاز به ارتباط و تعامل با دیتابیس دارند، بررسی کنیم.

به صورت زیر متد زیر را در کلاس AuthControllerTest، تعریف می‌کنیم:

/** @test */
public function login_authenticates_and_redirects_user()
{
    $user = User::factory()->create();

    $response = $this->post(route('login'), [
        'email' => $user->email,
        'password' => 'password'
    ]);

    $response->assertRedirect(route('index'));
    $this->assertAuthenticatedAs($user);
}

مشاهده می‌کنید که با استفاده از متد factory مربوط به مدل User، یک کاربر تصادفی ایجاد می‌کنیم. سپس یک درخواست را با استفاده از متد post، با همان ایمیل و رمز عبور به مسیر login ارسال می‌کنیم. سپس با استفاده از متد assetRedirect، هدایت شدن کاربر به صفحه‌ی اصلی را مشخص کرده و با متد assertAuthenticatedAs، اطلاعات کاربر وارد شده را مشخص می‌کنیم.

به خاطر داشته باشید که نمی‌توان از متد assetRedirect هنگام Redirect شدن به صفحه‌ی قبلی (مثلا هنگام مواجهه با Error) استفاده کرد.

حذف داده‌ی تصادفی

برای حذف داده‌های تصادفی ایجاد شده، پس از هربار اجرای تست، می‌توانید Trait با نام RefreshDatabase را در کلاس تست ایجاد شده، استفاده کنید:

<?php

namespace Tests\Feature\Http\Controllers;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class AuthControllerTest extends TestCase
{

    use RefreshDatabase;
    
    ...
    
}

تست چهارم

اکنون می‌خواهیم تست مربوط به ثبت نام موفق کاربر را انجام دهیم. برای آن‌که بتوانیم اطلاعات تصادفی را به مسیر register ارسال کنیم، نیاز داریم تا کلاس تستی که ایجاد کرده‌ایم، از Trait با نام WithFaker استفاده کند:

<?php

namespace Tests\Feature\Http\Controllers;

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class AuthControllerTest extends TestCase
{

    use RefreshDatabase, WithFaker;
    
    ...
    
}

اکنون متد زیر را در کلاس AuthControllerTest، تعریف می‌کنیم:

/** @test */
public function register_creates_and_authenticates_a_user()
{
    $name = $this->faker->name;
    $email = $this->faker->safeEmail;
    $password = $this->faker->password(8);

    $response = $this->post('/register', [
        'name' => $name,
        'email' => $email,
        'password' => $password,
        'password_confirmation' => $password,
    ]);

    $response->assertRedirect(route('index'));

    $this->assertDatabaseHas('users', [
        'name' => $name,
        'email' => $email
    ]);
}

همان‌‎طور که می‌بینید، ابتدا نام، ایمیل و رمز عبور تصادفی را ایجاد می‌کنیم. سپس با استفاده از متد post، اطلاعات را به مسیر /register ارسال می‌کنیم. در انتها نیز با استفاده از متد assertDatabaseHas از ذخیره شدن اطلاعات کاربر در دیتابیس مطمئن می‌شویم.

شاید متوجه شده باشید که در این تست، لاگین شدن کاربر را پس از ثبت نام، بررسی نکرده‌ایم. برای این‌کار می‌توانیم به روش زیر عمل کنیم:

/** @test */
public function register_creates_and_authenticates_a_user()
{
    $name = $this->faker->name;
    $email = $this->faker->safeEmail;
    $password = $this->faker->password(8);

    $response = $this->post('/register', [
        'name' => $name,
        'email' => $email,
        'password' => $password,
        'password_confirmation' => $password,
    ]);

    $response->assertRedirect(route('index'));

    $user = User::where('email', $email)->where('name', $name)->first();
    $this->assertNotNull($user);
    
    $this->assertAuthenticatedAs($user);
}

در این‌جا، برای بررسی لاگین بودن کاربر با استفاده از متد assertAuthenticatedAs، نیاز به اطلاعات کامل کاربر داریم. به همین منظور، اطلاعات کاربر را با استفاده از Eloquent از دیتابیس دریافت می‌کنیم. سپس با استفاده از متد assertNotNull، مشخص می‌کنیم که کاربر حتما وجود داشته باشد؛ پس دیگر نیازی به استفاده از متد assertDatabaseHas نداریم.

تست مسیرهایی که نیاز به احراز هویت دارند

برای تست مسیرهایی که نیاز به احراز هویت دارند، لازم است که یک کاربر تصادفی ایجاد کنیم تا با استفاده از متد actingAs، کاربر تصادفی، به عنوان کاربر لاگین شده عمل کند. برای مثال اگر بخواهیم فقط کاربران احراز هویت شده، به صفحه‌ی اصلی دسترسی داشته باشند، می‌توانیم برای تست نمایش صفحه‌ی اصلی به روش زیر عمل کنیم. ابتدا یک کلاس تست با نام HomeControllerTest در مسیر tests\Feature\Http\Controllers ایجاد کرده و متد زیر را در آن تعریف می‌کنیم:

<?php
namespace Tests\Feature\Http\Controllers;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class HomeControllerTest extends TestCase
{
    use RefreshDatabase;
    /** @test */
    public function index_returns_a_view()
    {
        $user = factory(User::class)->create();

        $response = $this->actingAs($user)->get(route(‘index’));

        $response->assertStatus(200);
    }
}

دستور Artisan برای اجرای تست

به جای استفاده از دستور PHPUnit، می‌توانید از دستور Artisan زیر استفاده کنید:

php artisan test

با اجرای دستور فوق، نحوه‌ی نمایش اجرای موفقیت‌آمیز تست به صورت خواهد بود:

Http Testing در لاراول

نکته‌ی پایانی

برای بخش‌هایی از اپلیکیشن، مانند ورود ناموفق، می‌توان تست‌های مختلفی نوشت و تمامی ارورها را شبیه‌سازی و تست کرد؛ اما هدف تست نویسی، اطمینان از صحت اجرای کدها و روند کلی اپلیکیشن است. بنابراین در این مورد و موارد مشابه، سعی کنید یک حالت را از تمامی حالات در نظر بگیرید و با اجرای موفقیت‌آمیز تست مربوطه، اطمینان حاصل کنید که اپلیکیشن شما در صورت بروز اخطار، به درستی عمل خواهد کرد.

تمرین

می‌توانید به عنوان تمرین، تست مربوط به نمایش صفحه‌ی اصلی بدون نیاز به احراز هویت کاربر و هم‌چنین، تست مربوط به نمایش فرم ثبت نام را تعریف کنید.

 

جمع بندی:

در مقاله‌ی Http Tests در لاراول، از مجموعه مقالات آموزش لاراول، توانستیم با استفاده از روش TDD یا Test Driven Development، بخش احراز هویت و ثبت نام اپلیکیشن خود را ایجاد کرده و تست‌های مربوطه را تعریف کنیم. به این روش تست نویسی، Http Test گفته می‌شود که درواقع، درخواست‌های Http و پاسخ‌های برگشتی را در اپلیکیشن لاراول، شبیه‌سازی می‌کند. شما هم به همین شیوه، می‌توانید برای اپلیکیشن‌های خود، عملیات تست‌نویسی را انجام دهید تا در انتها از اجرای صحیح کدها در حالت بهره‌برداری، مطمئن باشید.

امیدوار هستیم که آموزش Http Tests در لاراول، برای شما مفید بوده باشد. خوشحال می‌شویم نظرات، تجربیات و سوالات خود را با ما و سایر کاربران سون لرن به اشتراک بگذارید.

اگر به یادگیری بیشتر لاراول علاقه داری می‌توانی در دوره آموزشی لاراول کاربردی (بسته پروژه محور) شرکت کنی، این دوره شامل ۱۲ پروژه کاربردی و پر استفاده در دنیای واقعی است، که تمامی پروژه‌ها به صورت کامل برنامه‌ نویسی خواهند شد، تا دانشجو بتواند با روند ایجاد و تکمیل پروژه به صورت کامل آشنا شود.

چه امتیازی به این مقاله می دید؟
نویسنده رضا زیدی
از یادگیری ، عمل‌گرایی و چالش‌های مربوطه ، لذت می‌برم ...
ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :

 

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ما در سون لرن با محدودسازی دسترسی آزاد به اینترنت مخالفیم     اطلاعات بیشتر