نسخه:

تست های HTTP

معرفی

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

<?php
 
test('the application returns a successful response', function () {
$response = $this->get('/');
 
$response->assertStatus(200);
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_the_application_returns_a_successful_response(): void
{
$response = $this->get('/');
 
$response->assertStatus(200);
}
}

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

درخواست ها

برای ارسال درخواست به برنامه خود، می توانید از get , post , , یا روش های put موجود در آزمون خود استفاده کنید. این روش ها در واقع یک درخواست HTTP «واقعی» برای برنامه شما صادر نمی کنند. در عوض، کل درخواست شبکه به صورت داخلی شبیه سازی می شود. patch delete

روش‌های درخواست تست به جای برگرداندن یک Illuminate\Http\Response نمونه، نمونه‌ای از را برمی‌گردانند Illuminate\Testing\TestResponse که انواع ادعاهای مفیدی را ارائه می‌دهد که به شما امکان می‌دهد پاسخ‌های برنامه خود را بررسی کنید:

<?php
 
test('basic request', function () {
$response = $this->get('/');
 
$response->assertStatus(200);
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_a_basic_request(): void
{
$response = $this->get('/');
 
$response->assertStatus(200);
}
}

به طور کلی، هر یک از آزمون های شما باید فقط یک درخواست از برنامه شما داشته باشد. اگر چندین درخواست در یک روش آزمایشی اجرا شوند، ممکن است رفتار غیرمنتظره ای رخ دهد.

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

سفارشی سازی هدرهای درخواست

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

<?php
 
test('interacting with headers', function () {
$response = $this->withHeaders([
'X-Header' => 'Value',
])->post('/user', ['name' => 'Sally']);
 
$response->assertStatus(201);
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*/
public function test_interacting_with_headers(): void
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->post('/user', ['name' => 'Sally']);
 
$response->assertStatus(201);
}
}

بیسکویت ها

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

<?php
 
test('interacting with cookies', function () {
$response = $this->withCookie('color', 'blue')->get('/');
 
$response = $this->withCookies([
'color' => 'blue',
'name' => 'Taylor',
])->get('/');
 
//
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_interacting_with_cookies(): void
{
$response = $this->withCookie('color', 'blue')->get('/');
 
$response = $this->withCookies([
'color' => 'blue',
'name' => 'Taylor',
])->get('/');
 
//
}
}

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

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

<?php
 
test('interacting with the session', function () {
$response = $this->withSession(['banned' => false])->get('/');
 
//
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_interacting_with_the_session(): void
{
$response = $this->withSession(['banned' => false])->get('/');
 
//
}
}

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

<?php
 
use App\Models\User;
 
test('an action that requires authentication', function () {
$user = User::factory()->create();
 
$response = $this->actingAs($user)
->withSession(['banned' => false])
->get('/');
 
//
});
<?php
 
namespace Tests\Feature;
 
use App\Models\User;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_an_action_that_requires_authentication(): void
{
$user = User::factory()->create();
 
$response = $this->actingAs($user)
->withSession(['banned' => false])
->get('/');
 
//
}
}

همچنین می‌توانید با ارسال نام نگهبان به عنوان آرگومان دوم به متد، تعیین کنید که از کدام محافظ برای احراز هویت کاربر استفاده شود actingAs . محافظی که به actingAs روش ارائه می شود نیز در طول مدت آزمایش به محافظ پیش فرض تبدیل می شود:

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

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

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

<?php
 
test('basic test', function () {
$response = $this->get('/');
 
$response->dumpHeaders();
 
$response->dumpSession();
 
$response->dump();
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_basic_test(): void
{
$response = $this->get('/');
 
$response->dumpHeaders();
 
$response->dumpSession();
 
$response->dump();
}
}

از طرف دیگر، می‌توانید از روش‌های dd ، ddHeaders و ddSession برای حذف اطلاعات مربوط به پاسخ و سپس توقف اجرا استفاده کنید:

<?php
 
test('basic test', function () {
$response = $this->get('/');
 
$response->ddHeaders();
 
$response->ddSession();
 
$response->dd();
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_basic_test(): void
{
$response = $this->get('/');
 
$response->ddHeaders();
 
$response->ddSession();
 
$response->dd();
}
}

رسیدگی به استثنا

گاهی اوقات ممکن است بخواهید آزمایش کنید که برنامه شما یک استثنا خاص را ایجاد می کند. برای اطمینان از اینکه استثنا توسط کنترل کننده استثنای لاراول گرفتار نمی شود و به عنوان پاسخ HTTP برگردانده نمی شود، می توانید withoutExceptionHandling قبل از درخواست خود از روش استفاده کنید:

$response = $this->withoutExceptionHandling()->get('/');

علاوه بر این، اگر می‌خواهید مطمئن شوید که برنامه شما از ویژگی‌هایی استفاده نمی‌کند که توسط زبان PHP یا کتابخانه‌هایی که برنامه شما استفاده می‌کند منسوخ شده‌اند، می‌توانید withoutDeprecationHandling قبل از درخواست خود از روش استفاده کنید. هنگامی که مدیریت منسوخ شدن غیرفعال است، هشدارهای منسوخ شدن به استثنا تبدیل می‌شوند و در نتیجه باعث شکست تست شما می‌شوند:

$response = $this->withoutDeprecationHandling()->get('/');

این assertThrows روش ممکن است برای ادعای اینکه کد در یک بسته معین استثنایی از نوع مشخص شده ایجاد می کند استفاده شود:

$this->assertThrows(
fn () => (new ProcessOrder)->execute(),
OrderInvalid::class
);

تست API های JSON

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

<?php
 
test('making an api request', function () {
$response = $this->postJson('/api/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*/
public function test_making_an_api_request(): void
{
$response = $this->postJson('/api/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}

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

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

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

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

همانطور که قبلا ذکر شد، این assertJson روش ممکن است برای اثبات وجود قطعه ای از JSON در پاسخ JSON استفاده شود. اگر می خواهید تأیید کنید که آرایه داده شده دقیقاً با JSON بازگشتی برنامه شما مطابقت دارد، باید از assertExactJson روش زیر استفاده کنید:

<?php
 
test('asserting an exact json match', function () {
$response = $this->postJson('/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*/
public function test_asserting_an_exact_json_match(): void
{
$response = $this->postJson('/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}

ادعا در مسیرهای JSON

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

<?php
 
test('asserting a json path value', function () {
$response = $this->postJson('/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'Darian');
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*/
public function test_asserting_a_json_paths_value(): void
{
$response = $this->postJson('/user', ['name' => 'Sally']);
 
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'Darian');
}
}

این assertJsonPath روش همچنین یک بسته را می‌پذیرد، که ممکن است برای تعیین پویا استفاده شود که آیا ادعا باید تصویب شود یا خیر:

$response->assertJsonPath('team.owner.name', fn (string $name) => strlen($name) >= 3);

تست JSON روان

لاراول همچنین روشی زیبا برای آزمایش روان پاسخ های JSON برنامه شما ارائه می دهد. برای شروع، یک بسته به assertJson روش ارسال کنید. این بسته شدن با نمونه‌ای احضار می‌شود Illuminate\Testing\Fluent\AssertableJson که می‌توان از آن برای اظهارنظر علیه JSON که توسط برنامه شما برگردانده شده است استفاده کرد. این where روش ممکن است برای اظهار نظر علیه یک ویژگی خاص از JSON استفاده شود، در حالی که missing روش ممکن است برای ادعای عدم وجود یک ویژگی خاص در JSON استفاده شود:

use Illuminate\Testing\Fluent\AssertableJson;
 
test('fluent json', function () {
$response = $this->getJson('/users/1');
 
$response
->assertJson(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
});
use Illuminate\Testing\Fluent\AssertableJson;
 
/**
* A basic functional test example.
*/
public function test_fluent_json(): void
{
$response = $this->getJson('/users/1');
 
$response
->assertJson(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
}

درک etc روش

در مثال بالا، ممکن است متوجه شده باشید که ما etc روش را در انتهای زنجیره ادعای خود فراخوانی کردیم. این روش به لاراول اطلاع می دهد که ممکن است ویژگی های دیگری در شی JSON وجود داشته باشد. اگر از etc روش استفاده نشود، در صورتی که سایر ویژگی‌هایی که در مورد آنها ادعا نکرده‌اید در شی JSON وجود داشته باشند، آزمایش با شکست مواجه می‌شود.

هدف پشت این رفتار این است که از شما در برابر افشای ناخواسته اطلاعات حساس در پاسخ‌های JSON با مجبور کردن شما به صراحتاً ادعایی علیه ویژگی یا اجازه دادن صریح ویژگی‌های اضافی از طریق روش محافظت کند etc .

با این حال، باید توجه داشته باشید که شامل نکردن etc متد در زنجیره ادعای شما تضمین نمی‌کند که ویژگی‌های اضافی به آرایه‌هایی که درون شی JSON شما تودرتو هستند اضافه نمی‌شوند. این etc روش تنها تضمین می‌کند که هیچ ویژگی اضافی در سطح تودرتویی که etc متد در آن فراخوانی می‌شود وجود نداشته باشد.

اظهار وجود صفت / عدم وجود

برای اثبات وجود یا عدم وجود یک ویژگی، می توانید از روش has و استفاده کنید missing :

$response->assertJson(fn (AssertableJson $json) =>
$json->has('data')
->missing('message')
);

علاوه بر این، hasAll و missingAll متدها امکان اثبات وجود یا عدم وجود چندین ویژگی به طور همزمان را می‌دهند:

$response->assertJson(fn (AssertableJson $json) =>
$json->hasAll(['status', 'data'])
->missingAll(['message', 'code'])
);

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

$response->assertJson(fn (AssertableJson $json) =>
$json->has('status')
->hasAny('data', 'message', 'code')
);

ادعا در مقابل مجموعه های JSON

اغلب، مسیر شما یک پاسخ JSON که حاوی چندین مورد است، مانند چندین کاربر، برمی‌گرداند:

Route::get('/users', function () {
return User::all();
});

در این شرایط، ممکن است از روش شیء روان JSON has برای اظهارنظر علیه کاربران موجود در پاسخ استفاده کنیم. به عنوان مثال، اجازه دهید ادعا کنیم که پاسخ JSON شامل سه کاربر است. در مرحله بعد، با استفاده از این روش، در مورد اولین کاربر در مجموعه اظهاراتی خواهیم داشت first . این first روش یک بسته را می‌پذیرد که رشته JSON قابل ادعا دیگری را دریافت می‌کند که می‌توانیم از آن برای اظهارنظر درباره اولین شی در مجموعه JSON استفاده کنیم:

$response
->assertJson(fn (AssertableJson $json) =>
$json->has(3)
->first(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);

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

گاهی اوقات، مسیرهای برنامه شما مجموعه‌های JSON را برمی‌گرداند که کلیدهای نام‌گذاری شده به آنها اختصاص داده شده است:

Route::get('/users', function () {
return [
'meta' => [...],
'users' => User::all(),
];
})

هنگام آزمایش این مسیرها، می‌توانید از has روشی برای تأیید تعداد موارد موجود در مجموعه استفاده کنید. علاوه بر این، می توانید از این has روش برای ارائه زنجیره ای از ادعاها استفاده کنید:

$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3)
->has('users.0', fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);

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

$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3, fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);

اثبات انواع JSON

ممکن است فقط بخواهید ادعا کنید که خصوصیات در پاسخ JSON از نوع خاصی هستند. کلاس روش ها و روش هایی را برای انجام این کار Illuminate\Testing\Fluent\AssertableJson ارائه می دهد : whereType whereAllType

$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('id', 'integer')
->whereAllType([
'users.0.name' => 'string',
'meta' => 'array'
])
);

می توانید چندین نوع را با استفاده از | کاراکتر مشخص کنید، یا آرایه ای از انواع را به عنوان پارامتر دوم به whereType متد ارسال کنید. اگر مقدار پاسخ هر یک از انواع فهرست شده باشد، ادعا موفقیت آمیز خواهد بود:

$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('name', 'string|null')
->whereType('id', ['string', 'integer'])
);

متدهای whereType و whereAllType انواع زیر را تشخیص می دهند: string , integer , double , boolean , array و null .

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

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

<?php
 
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
 
test('avatars can be uploaded', function () {
Storage::fake('avatars');
 
$file = UploadedFile::fake()->image('avatar.jpg');
 
$response = $this->post('/avatar', [
'avatar' => $file,
]);
 
Storage::disk('avatars')->assertExists($file->hashName());
});
<?php
 
namespace Tests\Feature;
 
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_avatars_can_be_uploaded(): void
{
Storage::fake('avatars');
 
$file = UploadedFile::fake()->image('avatar.jpg');
 
$response = $this->post('/avatar', [
'avatar' => $file,
]);
 
Storage::disk('avatars')->assertExists($file->hashName());
}
}

اگر می خواهید ادعا کنید که یک فایل مشخص وجود ندارد، می توانید از assertMissing روش ارائه شده توسط Storage نما استفاده کنید:

Storage::fake('avatars');
 
// ...
 
Storage::disk('avatars')->assertMissing('missing.jpg');

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

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

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'
);

نماهای آزمایشی

لاراول همچنین به شما این امکان را می دهد که بدون درخواست HTTP شبیه سازی شده به برنامه، یک View ارائه دهید. برای انجام این کار، می توانید view روش موجود در آزمون خود را فراخوانی کنید. این view روش نام view و آرایه اختیاری داده را می پذیرد. این روش یک نمونه از را برمی‌گرداند Illuminate\Testing\TestView که چندین روش را برای اظهارنظر راحت در مورد محتوای view ارائه می‌کند:

<?php
 
test('a welcome view can be rendered', function () {
$view = $this->view('welcome', ['name' => 'Taylor']);
 
$view->assertSee('Taylor');
});
<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
public function test_a_welcome_view_can_be_rendered(): void
{
$view = $this->view('welcome', ['name' => 'Taylor']);
 
$view->assertSee('Taylor');
}
}

کلاس TestView متدهای ادعایی زیر را ارائه می دهد: assertSee , assertSeeInOrder , assertSeeText , assertSeeTextInOrder , assertDontSee و assertDontSeeText .

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

$contents = (string) $this->view('welcome');

خطاهای اشتراک گذاری

برخی از نماها ممکن است به خطاهای به اشتراک گذاشته شده در کیسه خطای جهانی ارائه شده توسط لاراول بستگی داشته باشند . برای هیدراته کردن کیسه خطا با پیام های خطا، می توانید از withViewErrors روش زیر استفاده کنید:

$view = $this->withViewErrors([
'name' => ['Please provide a valid name.']
])->view('form');
 
$view->assertSee('Please provide a valid name.');

رندر تیغه و اجزاء

در صورت لزوم، می‌توانید از این blade روش برای ارزیابی و ارائه یک رشته Blade خام استفاده کنید . مانند view متد، blade متد نمونه ای از Illuminate\Testing\TestView :

$view = $this->blade(
'<x-component :name="$name" />',
['name' => 'Taylor']
);
 
$view->assertSee('Taylor');

شما می توانید از این component روش برای ارزیابی و ارائه یک جزء Blade استفاده کنید . متد component نمونه ای از Illuminate\Testing\TestComponent :

$view = $this->component(Profile::class, ['name' => 'Taylor']);
 
$view->assertSee('Taylor');

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

اظهارات پاسخ

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

ادعا پذیرفته شد assertBadRequest ادعای تضاد عنوان کوکی assertCookie Expired assertCookieNotExpired اظهار کوکی گم شده است ادعا ایجاد شد ادعا کنید ببینید assertDontSeeText assertدانلود ادعای ExactJson ادعا ممنوع ادعا پیدا شد ادعا می کند assertHeader assertHeader Missing assertInternalServerError ادعای جیسون ادعای JsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject ادعای Json گم شده است assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonMissingPath assertJsonStructure assertJsonValidationErrors assertJsonValidationErrorFor تعیین مکان assertMethodNotAllowed assertMovedPermanently ادعای محتوا اظهار بدون محتوا assertStreamedContent assertNotFound اظهارت Ok assertPaymentRequired assertPlainCookie assertRedirect assertRedirectContains assertRedirectToRoute assertRedirectToSignedRoute assertRequestTimeout ادعا ببینید assertSeeInOrder assertSeeText assertSeeTextInOrder assertServerError assertService Unavailable assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSession Missing اظهار وضعیت ادعای موفقیت آمیز assertTooManyRequests ادعای غیر مجاز ادعا غیر قابل پردازش assertUnsupportedMediaType assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertView Missing

assertBadRequest

ادعا کنید که پاسخ دارای یک درخواست بد (400) کد وضعیت HTTP است:

$response->assertBadRequest();

ادعا پذیرفته شد

ادعا کنید که پاسخ دارای کد وضعیت HTTP (202) پذیرفته شده است:

$response->assertAccepted();

ادعای تضاد

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

$response->assertConflict();

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

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

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

$response->assertCookieExpired($cookieName);

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

$response->assertCookieNotExpired($cookieName);

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

$response->assertCookieMissing($cookieName);

ادعا ایجاد شد

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

$response->assertCreated();

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

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

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

assertDontSeeText

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

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

assertدانلود

ادعا کنید که پاسخ یک "دانلود" است. به طور معمول، این بدان معنی است که مسیر فراخوانی شده که پاسخ را برمی گرداند Response::download ، یک پاسخ BinaryFileResponse ، یا Storage::download پاسخ برمی گرداند:

$response->assertDownload();

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

$response->assertDownload('image.jpg');

ادعای ExactJson

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

$response->assertExactJson(array $data);

ادعا ممنوع

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

$response->assertForbidden();

ادعا پیدا شد

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

$response->assertFound();

ادعا می کند

ادعا کنید که پاسخ دارای کد وضعیت HTTP (410) رفته است:

$response->assertGone();

assertHeader

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

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

assertHeader Missing

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

$response->assertHeaderMissing($headerName);

assertInternalServerError

ادعا کنید که پاسخ دارای کد وضعیت HTTP "خطای سرور داخلی" (500) است:

$response->assertInternalServerError();

ادعای جیسون

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

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

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

ادعای JsonCount

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

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

assertJsonFragment

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

Route::get('/users', function () {
return [
'users' => [
[
'name' => 'Taylor Otwell',
],
],
];
});
 
$response->assertJsonFragment(['name' => 'Taylor Otwell']);

assertJsonIsArray

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

$response->assertJsonIsArray();

assertJsonIsObject

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

$response->assertJsonIsObject();

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

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

$response->assertJsonMissing(array $data);

assertJsonMissingExact

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

$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

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

$response->assertJsonMissingValidationErrors($keys);

روش عمومی تر assertValid ممکن است برای ادعای اینکه یک پاسخ دارای خطاهای اعتبارسنجی است که به عنوان JSON برگردانده شده است و هیچ خطایی به ذخیره سازی جلسه فلش نشده است استفاده شود.

assertJsonPath

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

$response->assertJsonPath($path, $expectedValue);

به عنوان مثال، اگر پاسخ JSON زیر توسط برنامه شما برگردانده شود:

{
"user": {
"name": "Steve Schoger"
}
}

شما می توانید ادعا کنید که name ویژگی شی user با یک مقدار داده شده مطابقت دارد مانند:

$response->assertJsonPath('user.name', 'Steve Schoger');

assertJsonMissingPath

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

$response->assertJsonMissingPath($path);

به عنوان مثال، اگر پاسخ JSON زیر توسط برنامه شما برگردانده شود:

{
"user": {
"name": "Steve Schoger"
}
}

email شما می توانید ادعا کنید که شامل ویژگی شی نیست user :

$response->assertJsonMissingPath('user.email');

assertJsonStructure

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

$response->assertJsonStructure(array $structure);

به عنوان مثال، اگر پاسخ JSON ارسال شده توسط برنامه شما حاوی داده های زیر باشد:

{
"user": {
"name": "Steve Schoger"
}
}

ممکن است ادعا کنید که ساختار JSON با انتظارات شما مطابقت دارد:

$response->assertJsonStructure([
'user' => [
'name',
]
]);

گاهی اوقات، پاسخ‌های JSON که توسط برنامه شما برگردانده می‌شوند ممکن است حاوی آرایه‌هایی از اشیاء باشند:

{
"user": [
{
"name": "Steve Schoger",
"age": 55,
"location": "Earth"
},
{
"name": "Mary Schoger",
"age": 60,
"location": "Earth"
}
]
}

در این شرایط، می‌توانید از * کاراکتر برای ادعا در برابر ساختار تمام اشیاء موجود در آرایه استفاده کنید:

$response->assertJsonStructure([
'user' => [
'*' => [
'name',
'age',
'location'
]
]
]);

assertJsonValidationErrors

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

$response->assertJsonValidationErrors(array $data, $responseKey = 'errors');

روش عمومی تر assertInvalid ممکن است برای ادعای اینکه یک پاسخ دارای خطاهای اعتبارسنجی است که به صورت JSON برگردانده شده است یا اینکه خطاها به ذخیره سازی جلسه فلش شده است استفاده شود.

assertJsonValidationErrorFor

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

$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');

assertMethodNotAllowed

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

$response->assertMethodNotAllowed();

assertMovedPermanently

ادعا کنید که پاسخ دارای کد وضعیت HTTP برای همیشه (301) است:

$response->assertMovedPermanently();

تعیین مکان

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

$response->assertLocation($uri);

ادعای محتوا

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

$response->assertContent($value);

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

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

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

assertStreamedContent

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

$response->assertStreamedContent($value);

assertNotFound

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

$response->assertNotFound();

اظهارت Ok

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

$response->assertOk();

assertPaymentRequired

ادعا کنید که پاسخ دارای کد وضعیت HTTP (402) برای پرداخت است:

$response->assertPaymentRequired();

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

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

assertRedirect

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

$response->assertRedirect($uri = null);

assertRedirectContains

ثابت کنید که آیا پاسخ به یک URI که شامل رشته داده شده است هدایت می شود یا خیر:

$response->assertRedirectContains($string);

assertRedirectToRoute

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

$response->assertRedirectToRoute($name, $parameters = []);

assertRedirectToSignedRoute

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

$response->assertRedirectToSignedRoute($name = null, $parameters = []);

assertRequestTimeout

ادعا کنید که پاسخ دارای مهلت زمانی درخواست (408) کد وضعیت HTTP است:

$response->assertRequestTimeout();

ادعا ببینید

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

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

assertSeeInOrder

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

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

assertSeeText

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

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

assertSeeTextInOrder

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

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

assertServerError

ادعا کنید که پاسخ دارای یک خطای سرور است (>= 500 , < 600) کد وضعیت HTTP:

$response->assertServerError();

assertService Unavailable

ادعا کنید که پاسخ دارای کد وضعیت HTTP "سرویس در دسترس نیست" (503):

$response->assertServiceUnavailable();

assertSessionHas

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

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

در صورت نیاز، بسته شدن را می توان به عنوان آرگومان دوم روش ارائه کرد assertSessionHas . اگر بسته شدن بازگردد، این ادعا تصویب خواهد شد true :

$response->assertSessionHas($key, function (User $value) {
return $value->name === 'Taylor Otwell';
});

assertSessionHasInput

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

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

در صورت نیاز، بسته شدن را می توان به عنوان آرگومان دوم روش ارائه کرد assertSessionHasInput . اگر بسته شدن بازگردد، این ادعا تصویب خواهد شد true :

use Illuminate\Support\Facades\Crypt;
 
$response->assertSessionHasInput($key, function (string $value) {
return Crypt::decryptString($value) === 'secret';
});

assertSessionHasAll

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

$response->assertSessionHasAll(array $data);

به عنوان مثال، اگر جلسه برنامه شما حاوی کلیدها name و status کلیدها باشد، می توانید ادعا کنید که هر دو وجود دارند و مقادیر مشخص شده را دارند مانند:

$response->assertSessionHasAll([
'name' => 'Taylor Otwell',
'status' => 'active',
]);

assertSessionHasErrors

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

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

به عنوان مثال، برای ادعای اینکه فیلدهای name و email دارای پیام‌های خطای اعتبارسنجی هستند که به جلسه فلش شده‌اند، می‌توانید از assertSessionHasErrors روشی مانند زیر استفاده کنید:

$response->assertSessionHasErrors(['name', 'email']);

یا، ممکن است ادعا کنید که یک فیلد مشخص دارای یک پیام خطای اعتبارسنجی خاص است:

$response->assertSessionHasErrors([
'name' => 'The given name was invalid.'
]);

روش عمومی تر assertInvalid ممکن است برای ادعای اینکه یک پاسخ دارای خطاهای اعتبارسنجی است که به صورت JSON برگردانده شده است یا اینکه خطاها به ذخیره سازی جلسه فلش شده است استفاده شود.

assertSessionHasErrorsIn

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

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

assertSessionHasNoErrors

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

$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

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

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

روش عمومی تر assertValid ممکن است برای ادعای اینکه یک پاسخ دارای خطاهای اعتبارسنجی است که به عنوان JSON برگردانده شده است و هیچ خطایی به ذخیره سازی جلسه فلش نشده است استفاده شود.

assertSession Missing

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

$response->assertSessionMissing($key);

اظهار وضعیت

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

$response->assertStatus($code);

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

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

$response->assertSuccessful();

assertTooManyRequests

ادعا کنید که پاسخ دارای درخواست های بسیار زیادی است (429) کد وضعیت HTTP:

$response->assertTooManyRequests();

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

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

$response->assertUnauthorized();

ادعا غیر قابل پردازش

ادعا کنید که پاسخ دارای یک موجودیت غیرقابل پردازش (422) کد وضعیت HTTP است:

$response->assertUnprocessable();

assertUnsupportedMediaType

ادعا کنید که پاسخ دارای کد وضعیت HTTP نوع رسانه پشتیبانی نشده (415) است:

$response->assertUnsupportedMediaType();

assertValid

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

// Assert that no validation errors are present...
$response->assertValid();
 
// Assert that the given keys do not have validation errors...
$response->assertValid(['name', 'email']);

assertInvalid

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

$response->assertInvalid(['name', 'email']);

همچنین می توانید ادعا کنید که یک کلید داده شده دارای یک پیام خطای اعتبارسنجی خاص است. هنگام انجام این کار، می توانید کل پیام یا فقط بخش کوچکی از پیام را ارائه دهید:

$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);

assertViewHas

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

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

ارسال یک بسته به عنوان آرگومان دوم به assertViewHas روش به شما این امکان را می‌دهد که یک داده خاص را بررسی کرده و ادعا کنید:

$response->assertViewHas('user', function (User $user) {
return $user->name === 'Taylor';
});

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

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

assertViewHasAll

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

$response->assertViewHasAll(array $data);

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

$response->assertViewHasAll([
'name',
'email',
]);

یا می‌توانید ادعا کنید که داده‌های view وجود دارند و مقادیر خاصی دارند:

$response->assertViewHasAll([
'name' => 'Taylor Otwell',
'email' => 'taylor@example.com,',
]);

assertViewIs

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

$response->assertViewIs($value);

assertView Missing

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

$response->assertViewMissing($key);

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

لاراول همچنین انواع مختلفی از ادعاهای مربوط به احراز هویت را ارائه می دهد که می توانید در تست ویژگی های برنامه خود از آنها استفاده کنید. توجه داشته باشید که این متدها در خود کلاس تست فراخوانی می شوند و نه Illuminate\Testing\TestResponse نمونه ای که توسط متدهایی مانند get و برگردانده می شود post .

عنوان تایید شده است

ادعا کنید که یک کاربر احراز هویت شده است:

$this->assertAuthenticated($guard = null);

مدعی مهمان

ادعا کنید که یک کاربر احراز هویت نشده است:

$this->assertGuest($guard = null);

assertAuthenticatedAs

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

$this->assertAuthenticatedAs($user, $guard = null);

ادعاهای اعتبارسنجی

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

assertValid

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

// Assert that no validation errors are present...
$response->assertValid();
 
// Assert that the given keys do not have validation errors...
$response->assertValid(['name', 'email']);

assertInvalid

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

$response->assertInvalid(['name', 'email']);

همچنین می توانید ادعا کنید که یک کلید داده شده دارای یک پیام خطای اعتبارسنجی خاص است. هنگام انجام این کار، می توانید کل پیام یا فقط بخش کوچکی از پیام را ارائه دهید:

$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);