نسخه:

تست های HTTP

معرفی

لاراول یک API بسیار روان برای درخواست HTTP به برنامه شما و بررسی خروجی ارائه می دهد. به عنوان مثال، به تست ویژگی تعریف شده در زیر نگاه کنید:

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
 
$response->assertStatus(200);
}
}

متد درخواستی را به برنامه get ارسال می کند ، در حالی که متد ادعا می کند که پاسخ برگشتی باید کد وضعیت HTTP داده شده را داشته باشد. علاوه بر این ادعای ساده، لاراول حاوی انواع ادعاها برای بررسی سرصفحه‌های پاسخ، محتوا، ساختار JSON و موارد دیگر است. GET assertStatus

سفارشی کردن هدر درخواست

می توانید از این withHeaders روش برای سفارشی کردن هدرهای درخواست قبل از ارسال به برنامه استفاده کنید. این به شما امکان می دهد تا هر سرفصل سفارشی را که می خواهید به درخواست اضافه کنید:

<?php
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->json('POST', '/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}

میان‌افزار CSRF به‌طور خودکار هنگام اجرای آزمایش‌ها غیرفعال می‌شود.

بیسکویت ها

می توانید قبل از درخواست از روش withCookie یا برای تنظیم مقادیر کوکی استفاده کنید. withCookies متد withCookie یک نام کوکی و مقدار را به عنوان دو آرگومان خود می پذیرد، در حالی که withCookies متد آرایه ای از جفت نام / مقدار را می پذیرد:

<?php
 
class ExampleTest extends TestCase
{
public function testCookies()
{
$response = $this->withCookie('color', 'blue')->get('/');
 
$response = $this->withCookies([
'color' => 'blue',
'name' => 'Taylor',
])->get('/');
}
}

پاسخ های اشکال زدایی

پس از ارائه یک درخواست آزمایشی برای برنامه شما، روش های dump , dumpHeaders و dumpSession ممکن است برای بررسی و اشکال زدایی محتوای پاسخ استفاده شود:

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
 
$response->dumpHeaders();
 
$response->dumpSession();
 
$response->dump();
}
}

جلسه / احراز هویت

لاراول چندین کمک برای کار با جلسه در طول آزمایش HTTP ارائه می دهد. ابتدا، می‌توانید داده‌های جلسه را با استفاده از withSession روش روی یک آرایه مشخص تنظیم کنید. این برای بارگیری جلسه با داده ها قبل از صدور درخواست برای برنامه شما مفید است:

<?php
 
class ExampleTest extends TestCase
{
public function testApplication()
{
$response = $this->withSession(['foo' => 'bar'])
->get('/');
}
}

یکی از استفاده های رایج از Session برای حفظ حالت برای کاربر احراز هویت شده است. روش actingAs کمکی یک راه ساده برای احراز هویت یک کاربر معین به عنوان کاربر فعلی ارائه می دهد. به عنوان مثال، ممکن است از یک کارخانه مدل برای تولید و احراز هویت یک کاربر استفاده کنیم:

<?php
 
use App\User;
 
class ExampleTest extends TestCase
{
public function testApplication()
{
$user = factory(User::class)->create();
 
$response = $this->actingAs($user)
->withSession(['foo' => 'bar'])
->get('/');
}
}

همچنین می‌توانید با ارسال نام محافظ به‌عنوان آرگومان دوم در متد، مشخص کنید که از کدام محافظ برای احراز هویت کاربر استفاده می‌شود actingAs :

$this->actingAs($user, 'api')

تست API های JSON

لاراول همچنین چندین کمک برای آزمایش API های JSON و پاسخ های آنها ارائه می دهد. برای مثال، متدهای json , getJson , postJson , putJson , patchJson , deleteJson و optionsJson ممکن است برای صدور درخواست های JSON با افعال مختلف HTTP استفاده شوند. همچنین می توانید به راحتی داده ها و هدرها را به این روش ها منتقل کنید. برای شروع، بیایید آزمایشی بنویسیم تا درخواستی POST را ارائه کنیم /user و تأیید کنیم که داده های مورد انتظار برگردانده شده است:

<?php
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->postJson('/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}

این assertJson روش پاسخ را به یک آرایه تبدیل می‌کند و PHPUnit::assertArraySubset برای تأیید وجود آرایه داده‌شده در پاسخ JSON که توسط برنامه برگردانده شده است، استفاده می‌کند. بنابراین، اگر ویژگی های دیگری در پاسخ JSON وجود داشته باشد، تا زمانی که قطعه داده شده وجود داشته باشد، این آزمایش همچنان با موفقیت انجام می شود.

علاوه بر این، داده های پاسخ JSON ممکن است به عنوان متغیرهای آرایه در پاسخ قابل دسترسی باشند:

$this->assertTrue($response['created']);

تأیید تطابق دقیق JSON

اگر می خواهید تأیید کنید که آرایه داده شده دقیقاً مطابق با JSON برگردانده شده توسط برنامه است، باید از assertExactJson روش زیر استفاده کنید:

<?php
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}

بررسی مسیرهای JSON

اگر می خواهید تأیید کنید که پاسخ JSON حاوی برخی داده های داده شده در یک مسیر مشخص است، باید از assertJsonPath روش استفاده کنید:

<?php
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'foo')
}
}

تست آپلود فایل

کلاس روشی را Illuminate\Http\UploadedFile ارائه می دهد fake که ممکن است برای تولید فایل های ساختگی یا تصاویر برای آزمایش استفاده شود. این، همراه با روش Storage نما fake ، آزمایش بارگذاری فایل را بسیار ساده می کند. برای مثال، می‌توانید این دو ویژگی را برای آزمایش آسان فرم آپلود آواتار ترکیب کنید:

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function testAvatarUpload()
{
Storage::fake('avatars');
 
$file = UploadedFile::fake()->image('avatar.jpg');
 
$response = $this->json('POST', '/avatar', [
'avatar' => $file,
]);
 
// Assert the file was stored...
Storage::disk('avatars')->assertExists($file->hashName());
 
// Assert a file does not exist...
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}

سفارشی سازی فایل جعلی

هنگام ایجاد فایل ها با استفاده از این fake روش، می توانید عرض، ارتفاع و اندازه تصویر را مشخص کنید تا قوانین اعتبارسنجی خود را بهتر آزمایش کنید:

UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);

علاوه بر ایجاد تصاویر، می توانید با استفاده از create روش زیر فایل هایی از هر نوع دیگری ایجاد کنید:

UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);

در صورت نیاز، می‌توانید یک $mimeType آرگومان به متد ارسال کنید تا نوع MIME را که باید توسط فایل برگردانده شود، به صراحت تعریف کنید:

UploadedFile::fake()->create('document.pdf', $sizeInKilobytes, 'application/pdf');

ادعاهای موجود

اظهارات پاسخ

لاراول انواع مختلفی از روش‌های ادعای سفارشی را برای تست‌های ویژگی PHPUnit شما ارائه می‌کند . این ادعاها ممکن است در پاسخی که از روش‌های آزمایشی json ، get , post , put , و برگردانده می‌شود قابل دسترسی باشد delete :

ادعا کنید که پاسخ حاوی کوکی داده شده است:

$response->assertCookie($cookieName, $value = null);

ادعا کنید که پاسخ حاوی کوکی داده شده است و منقضی شده است:

$response->assertCookieExpired($cookieName);

ادعا کنید که پاسخ حاوی کوکی داده شده است و منقضی نشده است:

$response->assertCookieNotExpired($cookieName);

ادعا کنید که پاسخ حاوی کوکی داده شده نیست:

$response->assertCookieMissing($cookieName);

ادعا ایجاد شد

ادعا کنید که پاسخ دارای کد وضعیت 201 است:

$response->assertCreated();

ادعا کنید ببینید

ادعا کنید که رشته داده شده در پاسخ موجود نیست. این ادعا به طور خودکار از رشته داده شده فرار می کند مگر اینکه آرگومان دومی را ارسال کنید false :

$response->assertDontSee($value, $escaped = true);

assertDontSeeText

ادعا کنید که رشته داده شده در متن پاسخ موجود نیست. این ادعا به طور خودکار از رشته داده شده فرار می کند مگر اینکه آرگومان دومی را ارسال کنید false :

$response->assertDontSeeText($value, $escaped = true);

ادعای ExactJson

ادعا کنید که پاسخ حاوی تطابق دقیق با داده‌های JSON است:

$response->assertExactJson(array $data);

ادعا ممنوع

ادعا کنید که پاسخ دارای کد وضعیت ممنوعه (403) است:

$response->assertForbidden();

assertHeader

ادعا کنید که هدر داده شده در پاسخ وجود دارد:

$response->assertHeader($headerName, $value = null);

assertHeader Missing

ادعا کنید که هدر داده شده در پاسخ وجود ندارد:

$response->assertHeaderMissing($headerName);

ادعای جیسون

ادعا کنید که پاسخ حاوی داده‌های JSON است:

$response->assertJson(array $data, $strict = false);

ادعای JsonCount

ادعا کنید که پاسخ JSON دارای یک آرایه با تعداد مورد انتظار در کلید داده شده است:

$response->assertJsonCount($count, $key = null);

assertJsonFragment

ادعا کنید که پاسخ شامل قطعه JSON داده شده است:

$response->assertJsonFragment(array $data);

ادعای Json گم شده است

ادعا کنید که پاسخ شامل قطعه JSON داده شده نیست:

$response->assertJsonMissing(array $data);

assertJsonMissingExact

ادعا کنید که پاسخ شامل قطعه JSON دقیق نیست:

$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

ادعا کنید که پاسخ هیچ خطای اعتبارسنجی JSON برای کلیدهای داده شده ندارد:

$response->assertJsonMissingValidationErrors($keys);

assertJsonPath

ادعا کنید که پاسخ حاوی داده های داده شده در مسیر مشخص شده است:

$response->assertJsonPath($path, array $data, $strict = false);

assertJsonStructure

ادعا کنید که پاسخ دارای ساختار JSON داده شده است:

$response->assertJsonStructure(array $structure);

assertJsonValidationErrors

ادعا کنید که پاسخ دارای خطاهای اعتبارسنجی JSON داده شده است:

$response->assertJsonValidationErrors(array $data);

تعیین مکان

ادعا کنید که پاسخ دارای مقدار URI داده شده در Location هدر است:

$response->assertLocation($uri);

اظهار بدون محتوا

ادعا کنید که پاسخ دارای کد وضعیت داده شده است و محتوایی ندارد.

$response->assertNoContent($status = 204);

assertNotFound

ادعا کنید که پاسخ دارای کد وضعیت یافت نشده است:

$response->assertNotFound();

اظهارت Ok

ادعا کنید که پاسخ دارای کد وضعیت 200 است:

$response->assertOk();

ادعا کنید که پاسخ حاوی کوکی داده شده است (رمزگذاری نشده):

$response->assertPlainCookie($cookieName, $value = null);

assertRedirect

ادعا کنید که پاسخ یک تغییر مسیر به یک URI معین است:

$response->assertRedirect($uri);

ادعا ببینید

ادعا کنید که رشته داده شده در پاسخ موجود است. این ادعا به طور خودکار از رشته داده شده فرار می کند مگر اینکه آرگومان دومی را ارسال کنید false :

$response->assertSee($value, $escaped = true);

assertSeeInOrder

ادعا کنید که رشته های داده شده به ترتیب در پاسخ قرار دارند. این ادعا به طور خودکار از رشته های داده شده فرار می کند مگر اینکه آرگومان دومی را ارسال کنید false :

$response->assertSeeInOrder(array $values, $escaped = true);

assertSeeText

ادعا کنید که رشته داده شده در متن پاسخ موجود است. این ادعا به طور خودکار از رشته داده شده فرار می کند مگر اینکه آرگومان دومی را ارسال کنید false :

$response->assertSeeText($value, $escaped = true);

assertSeeTextInOrder

ادعا کنید که رشته های داده شده به ترتیب در متن پاسخ قرار دارند. این ادعا به طور خودکار از رشته های داده شده فرار می کند مگر اینکه آرگومان دومی را ارسال کنید false :

$response->assertSeeTextInOrder(array $values, $escaped = true);

assertSessionHas

ادعا کنید که جلسه شامل قطعه داده شده است:

$response->assertSessionHas($key, $value = null);

assertSessionHasInput

ادعا کنید که جلسه دارای مقدار مشخصی در آرایه ورودی فلش شده است:

$response->assertSessionHasInput($key, $value = null);

assertSessionHasAll

ادعا کنید که جلسه دارای لیستی از مقادیر است:

$response->assertSessionHasAll(array $data);

assertSessionHasErrors

ادعا کنید که جلسه حاوی خطای داده شده است $keys . اگر $keys یک آرایه انجمنی است، بیان کنید که جلسه حاوی یک پیام خطای خاص (مقدار) برای هر فیلد (کلید) است:

$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');

assertSessionHasErrorsIn

ادعا کنید که جلسه حاوی خطای داده شده $keys در یک کیسه خطای خاص است. اگر $keys یک آرایه انجمنی است، ادعا کنید که جلسه حاوی یک پیام خطای خاص (مقدار) برای هر فیلد (کلید)، در کیسه خطا است:

$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);

assertSessionHasNoErrors

تاکید کنید که جلسه هیچ خطایی ندارد:

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

ادعا کنید که جلسه هیچ خطایی برای کلیدهای داده شده ندارد:

$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');

assertSession Missing

ادعا کنید که جلسه شامل کلید داده شده نیست:

$response->assertSessionMissing($key);

اظهار وضعیت

ادعا کنید که پاسخ دارای کد داده شده است:

$response->assertStatus($code);

ادعای موفقیت آمیز

ادعا کنید که پاسخ دارای کد وضعیت موفق (>= 200 و < 300) است:

$response->assertSuccessful();

ادعای غیر مجاز

ادعا کنید که پاسخ دارای کد وضعیت غیرمجاز (401) است:

$response->assertUnauthorized();

assertViewHas

ادعا کنید که نمای پاسخ بخشی از داده داده شده است:

$response->assertViewHas($key, $value = null);

علاوه بر این، داده‌های مشاهده ممکن است به عنوان متغیرهای آرایه در پاسخ قابل دسترسی باشند:

$this->assertEquals('Taylor', $response['name']);

assertViewHasAll

ادعا کنید که نمای پاسخ دارای یک لیست داده شده است:

$response->assertViewHasAll(array $data);

assertViewIs

ادعا کنید که نمای داده شده توسط مسیر برگردانده شده است:

$response->assertViewIs($value);

assertView Missing

ادعا کنید که نمای پاسخ دارای یک قطعه داده محدود شده است:

$response->assertViewMissing($key);

اظهارات احراز هویت

لاراول همچنین انواع مختلفی از ادعاهای مربوط به احراز هویت را برای تست های ویژگی PHPUnit شما ارائه می دهد :

روش شرح
$this->assertAuthenticated($guard = null); ادعا کنید که کاربر احراز هویت شده است.
$this->assertGuest($guard = null); ادعا کنید که کاربر احراز هویت نشده است.
$this->assertAuthenticatedAs($user, $guard = null); ادعا کنید که کاربر مورد نظر احراز هویت شده است.
$this->assertCredentials(array $credentials, $guard = null); تأیید کنید که اعتبارنامه های داده شده معتبر هستند.
$this->assertInvalidCredentials(array $credentials, $guard = null); ادعا کنید که اعتبار داده شده نامعتبر است.