跳到內容

HTTP 測試

簡介

Laravel 提供了一個非常流暢的 API,用於向您的應用程式發出 HTTP 請求並檢查回應。例如,看看下面定義的功能測試

1<?php
2 
3test('the application returns a successful response', function () {
4 $response = $this->get('/');
5 
6 $response->assertStatus(200);
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_the_application_returns_a_successful_response(): void
13 {
14 $response = $this->get('/');
15 
16 $response->assertStatus(200);
17 }
18}

get 方法向應用程式發出 GET 請求,而 assertStatus 方法斷言返回的回應應具有給定的 HTTP 狀態碼。除了這個簡單的斷言之外,Laravel 還包含各種斷言,用於檢查回應標頭、內容、JSON 結構等等。

發出請求

若要向您的應用程式發出請求,您可以調用測試中的 getpostputpatchdelete 方法。這些方法實際上並不會向您的應用程式發出「真實」的 HTTP 請求。相反,整個網路請求是在內部模擬的。

測試請求方法不會返回 Illuminate\Http\Response 實例,而是返回 Illuminate\Testing\TestResponse 的實例,它提供了各種有用的斷言,讓您可以檢查應用程式的回應

1<?php
2 
3test('basic request', function () {
4 $response = $this->get('/');
5 
6 $response->assertStatus(200);
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_a_basic_request(): void
13 {
14 $response = $this->get('/');
15 
16 $response->assertStatus(200);
17 }
18}

一般來說,您的每個測試都應該只向您的應用程式發出一個請求。如果在單個測試方法中執行多個請求,可能會發生意外行為。

為了方便起見,CSRF 中介層在執行測試時會自動停用。

自訂請求標頭

您可以使用 withHeaders 方法來自訂請求的標頭,然後再將其發送到應用程式。此方法可讓您將任何自訂標頭新增至請求

1<?php
2 
3test('interacting with headers', function () {
4 $response = $this->withHeaders([
5 'X-Header' => 'Value',
6 ])->post('/user', ['name' => 'Sally']);
7 
8 $response->assertStatus(201);
9});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_interacting_with_headers(): void
13 {
14 $response = $this->withHeaders([
15 'X-Header' => 'Value',
16 ])->post('/user', ['name' => 'Sally']);
17 
18 $response->assertStatus(201);
19 }
20}

Cookies

您可以使用 withCookiewithCookies 方法在發出請求之前設定 Cookie 值。 withCookie 方法接受 Cookie 名稱和值作為其兩個引數,而 withCookies 方法接受名稱/值配對的陣列

1<?php
2 
3test('interacting with cookies', function () {
4 $response = $this->withCookie('color', 'blue')->get('/');
5 
6 $response = $this->withCookies([
7 'color' => 'blue',
8 'name' => 'Taylor',
9 ])->get('/');
10 
11 //
12});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_interacting_with_cookies(): void
10 {
11 $response = $this->withCookie('color', 'blue')->get('/');
12 
13 $response = $this->withCookies([
14 'color' => 'blue',
15 'name' => 'Taylor',
16 ])->get('/');
17 
18 //
19 }
20}

Session / 身份驗證

Laravel 提供了幾個輔助函式,用於在 HTTP 測試期間與 session 互動。首先,您可以使用 withSession 方法將 session 資料設定為給定的陣列。這對於在向您的應用程式發出請求之前載入 session 資料非常有用

1<?php
2 
3test('interacting with the session', function () {
4 $response = $this->withSession(['banned' => false])->get('/');
5 
6 //
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_interacting_with_the_session(): void
10 {
11 $response = $this->withSession(['banned' => false])->get('/');
12 
13 //
14 }
15}

Laravel 的 session 通常用於維護目前已驗證使用者的狀態。因此,actingAs 輔助函式提供了一種簡單的方式來驗證給定使用者作為目前使用者。例如,我們可以使用模型工廠來產生和驗證使用者

1<?php
2 
3use App\Models\User;
4 
5test('an action that requires authentication', function () {
6 $user = User::factory()->create();
7 
8 $response = $this->actingAs($user)
9 ->withSession(['banned' => false])
10 ->get('/');
11 
12 //
13});
1<?php
2 
3namespace Tests\Feature;
4 
5use App\Models\User;
6use Tests\TestCase;
7 
8class ExampleTest extends TestCase
9{
10 public function test_an_action_that_requires_authentication(): void
11 {
12 $user = User::factory()->create();
13 
14 $response = $this->actingAs($user)
15 ->withSession(['banned' => false])
16 ->get('/');
17 
18 //
19 }
20}

您也可以透過將 guard 名稱作為第二個引數傳遞給 actingAs 方法,來指定應使用哪個 guard 來驗證給定使用者。提供給 actingAs 方法的 guard 也將成為測試期間的預設 guard

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

偵錯回應

在向您的應用程式發出測試請求後,可以使用 dumpdumpHeadersdumpSession 方法來檢查和偵錯回應內容

1<?php
2 
3test('basic test', function () {
4 $response = $this->get('/');
5 
6 $response->dumpHeaders();
7 
8 $response->dumpSession();
9 
10 $response->dump();
11});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_basic_test(): void
13 {
14 $response = $this->get('/');
15 
16 $response->dumpHeaders();
17 
18 $response->dumpSession();
19 
20 $response->dump();
21 }
22}

或者,您可以使用 ddddHeadersddSessionddJson 方法來傾印有關回應的資訊,然後停止執行

1<?php
2 
3test('basic test', function () {
4 $response = $this->get('/');
5 
6 $response->ddHeaders();
7 $response->ddSession();
8 $response->ddJson();
9 $response->dd();
10});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_basic_test(): void
13 {
14 $response = $this->get('/');
15 
16 $response->ddHeaders();
17 
18 $response->ddSession();
19 
20 $response->dd();
21 }
22}

例外處理

有時您可能需要測試您的應用程式是否拋出特定的例外。為了實現這一點,您可以透過 Exceptions facade「偽造」例外處理程式。一旦例外處理程式被偽造,您可以使用 assertReportedassertNotReported 方法來斷言在請求期間拋出的例外

1<?php
2 
3use App\Exceptions\InvalidOrderException;
4use Illuminate\Support\Facades\Exceptions;
5 
6test('exception is thrown', function () {
7 Exceptions::fake();
8 
9 $response = $this->get('/order/1');
10 
11 // Assert an exception was thrown...
12 Exceptions::assertReported(InvalidOrderException::class);
13 
14 // Assert against the exception...
15 Exceptions::assertReported(function (InvalidOrderException $e) {
16 return $e->getMessage() === 'The order was invalid.';
17 });
18});
1<?php
2 
3namespace Tests\Feature;
4 
5use App\Exceptions\InvalidOrderException;
6use Illuminate\Support\Facades\Exceptions;
7use Tests\TestCase;
8 
9class ExampleTest extends TestCase
10{
11 /**
12 * A basic test example.
13 */
14 public function test_exception_is_thrown(): void
15 {
16 Exceptions::fake();
17 
18 $response = $this->get('/');
19 
20 // Assert an exception was thrown...
21 Exceptions::assertReported(InvalidOrderException::class);
22 
23 // Assert against the exception...
24 Exceptions::assertReported(function (InvalidOrderException $e) {
25 return $e->getMessage() === 'The order was invalid.';
26 });
27 }
28}

assertNotReportedassertNothingReported 方法可用於斷言在請求期間未拋出給定的例外,或者未拋出任何例外

1Exceptions::assertNotReported(InvalidOrderException::class);
2 
3Exceptions::assertNothingReported();

您可以透過在發出請求之前調用 withoutExceptionHandling 方法,完全停用給定請求的例外處理

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

此外,如果您想確保您的應用程式未使用 PHP 語言或您的應用程式正在使用的程式庫已棄用的功能,您可以在發出請求之前調用 withoutDeprecationHandling 方法。當停用棄用處理時,棄用警告將轉換為例外,從而導致您的測試失敗

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

assertThrows 方法可用於斷言給定 closure 內的程式碼拋出指定類型的例外

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

如果您想檢查並斷言拋出的例外,您可以提供一個 closure 作為 assertThrows 方法的第二個引數

1$this->assertThrows(
2 fn () => (new ProcessOrder)->execute(),
3 fn (OrderInvalid $e) => $e->orderId() === 123;
4);

測試 JSON API

Laravel 還提供了幾個輔助函式,用於測試 JSON API 及其回應。例如,jsongetJsonpostJsonputJsonpatchJsondeleteJsonoptionsJson 方法可用於發出具有各種 HTTP 動詞的 JSON 請求。您也可以輕鬆地將資料和標頭傳遞給這些方法。首先,讓我們編寫一個測試,向 /api/user 發出 POST 請求,並斷言返回了預期的 JSON 資料

1<?php
2 
3test('making an api request', function () {
4 $response = $this->postJson('/api/user', ['name' => 'Sally']);
5 
6 $response
7 ->assertStatus(201)
8 ->assertJson([
9 'created' => true,
10 ]);
11});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_making_an_api_request(): void
13 {
14 $response = $this->postJson('/api/user', ['name' => 'Sally']);
15 
16 $response
17 ->assertStatus(201)
18 ->assertJson([
19 'created' => true,
20 ]);
21 }
22}

此外,JSON 回應資料可以作為回應上的陣列變數存取,讓您可以方便地檢查 JSON 回應中返回的各個值

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

assertJson 方法將回應轉換為陣列,以驗證給定的陣列是否存在於應用程式返回的 JSON 回應中。因此,如果 JSON 回應中還有其他屬性,只要給定的片段存在,此測試仍會通過。

斷言精確的 JSON 比對

如前所述,assertJson 方法可用於斷言 JSON 片段是否存在於 JSON 回應中。如果您想驗證給定的陣列完全符合您的應用程式返回的 JSON,您應該使用 assertExactJson 方法

1<?php
2 
3test('asserting an exact json match', function () {
4 $response = $this->postJson('/user', ['name' => 'Sally']);
5 
6 $response
7 ->assertStatus(201)
8 ->assertExactJson([
9 'created' => true,
10 ]);
11});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_asserting_an_exact_json_match(): void
13 {
14 $response = $this->postJson('/user', ['name' => 'Sally']);
15 
16 $response
17 ->assertStatus(201)
18 ->assertExactJson([
19 'created' => true,
20 ]);
21 }
22}

斷言 JSON 路徑

如果您想驗證 JSON 回應是否在指定的路徑中包含給定的資料,您應該使用 assertJsonPath 方法

1<?php
2 
3test('asserting a json path value', function () {
4 $response = $this->postJson('/user', ['name' => 'Sally']);
5 
6 $response
7 ->assertStatus(201)
8 ->assertJsonPath('team.owner.name', 'Darian');
9});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic functional test example.
11 */
12 public function test_asserting_a_json_paths_value(): void
13 {
14 $response = $this->postJson('/user', ['name' => 'Sally']);
15 
16 $response
17 ->assertStatus(201)
18 ->assertJsonPath('team.owner.name', 'Darian');
19 }
20}

assertJsonPath 方法也接受一個 closure,可用於動態判斷斷言是否應該通過

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

Fluent JSON 測試

Laravel 還提供了一種優美的方式來流暢地測試您的應用程式的 JSON 回應。首先,將一個 closure 傳遞給 assertJson 方法。將使用 Illuminate\Testing\Fluent\AssertableJson 的實例調用此 closure,該實例可用於對您的應用程式返回的 JSON 進行斷言。 where 方法可用於對 JSON 的特定屬性進行斷言,而 missing 方法可用於斷言 JSON 中缺少特定屬性

1use Illuminate\Testing\Fluent\AssertableJson;
2 
3test('fluent json', function () {
4 $response = $this->getJson('/users/1');
5 
6 $response
7 ->assertJson(fn (AssertableJson $json) =>
8 $json->where('id', 1)
9 ->where('name', 'Victoria Faith')
10 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
11 ->whereNot('status', 'pending')
12 ->missing('password')
13 ->etc()
14 );
15});
1use Illuminate\Testing\Fluent\AssertableJson;
2 
3/**
4 * A basic functional test example.
5 */
6public function test_fluent_json(): void
7{
8 $response = $this->getJson('/users/1');
9 
10 $response
11 ->assertJson(fn (AssertableJson $json) =>
12 $json->where('id', 1)
13 ->where('name', 'Victoria Faith')
14 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
15 ->whereNot('status', 'pending')
16 ->missing('password')
17 ->etc()
18 );
19}

了解 etc 方法

在上面的範例中,您可能已經注意到我們在斷言鏈的末尾調用了 etc 方法。此方法告知 Laravel JSON 物件上可能存在其他屬性。如果未使用 etc 方法,則如果 JSON 物件上存在您未進行斷言的其他屬性,則測試將失敗。

此行為背後的意圖是透過強制您明確地對屬性進行斷言,或透過 etc 方法明確允許其他屬性,來保護您免於意外地在 JSON 回應中公開敏感資訊。

但是,您應該注意,在您的斷言鏈中不包含 etc 方法並不能確保不會將其他屬性新增到巢狀在 JSON 物件中的陣列中。 etc 方法僅確保在調用 etc 方法的巢狀層級中不存在其他屬性。

斷言屬性存在/不存在

若要斷言屬性存在或不存在,您可以使用 hasmissing 方法

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

此外,hasAllmissingAll 方法允許同時斷言多個屬性的存在或不存在

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

您可以使用 hasAny 方法來判斷是否至少存在給定屬性清單中的一個

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

斷言 JSON 集合

通常,您的路由將返回包含多個項目的 JSON 回應,例如多個使用者

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

在這些情況下,我們可以使用流暢 JSON 物件的 has 方法來對回應中包含的使用者進行斷言。例如,讓我們斷言 JSON 回應包含三個使用者。接下來,我們將使用 first 方法對集合中的第一個使用者進行一些斷言。 first 方法接受一個 closure,該 closure 接收另一個可斷言的 JSON 字串,我們可以使用它來對 JSON 集合中的第一個物件進行斷言

1$response
2 ->assertJson(fn (AssertableJson $json) =>
3 $json->has(3)
4 ->first(fn (AssertableJson $json) =>
5 $json->where('id', 1)
6 ->where('name', 'Victoria Faith')
7 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
8 ->missing('password')
9 ->etc()
10 )
11 );

JSON 集合斷言的範圍界定

有時,您的應用程式的路由將返回分配了具名索引鍵的 JSON 集合

1Route::get('/users', function () {
2 return [
3 'meta' => [...],
4 'users' => User::all(),
5 ];
6})

在測試這些路由時,您可以使用 has 方法來斷言集合中項目的數量。此外,您可以使用 has 方法來限定斷言鏈的範圍

1$response
2 ->assertJson(fn (AssertableJson $json) =>
3 $json->has('meta')
4 ->has('users', 3)
5 ->has('users.0', fn (AssertableJson $json) =>
6 $json->where('id', 1)
7 ->where('name', 'Victoria Faith')
8 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
9 ->missing('password')
10 ->etc()
11 )
12 );

但是,您可以單次調用 has 方法,並將 closure 作為其第三個參數提供,而不是對 users 集合進行兩次單獨的 has 方法調用。這樣做時,closure 將自動調用並限定為集合中的第一個項目

1$response
2 ->assertJson(fn (AssertableJson $json) =>
3 $json->has('meta')
4 ->has('users', 3, fn (AssertableJson $json) =>
5 $json->where('id', 1)
6 ->where('name', 'Victoria Faith')
7 ->where('email', fn (string $email) => str($email)->is('[email protected]'))
8 ->missing('password')
9 ->etc()
10 )
11 );

斷言 JSON 類型

您可能只想斷言 JSON 回應中的屬性是某種類型。 Illuminate\Testing\Fluent\AssertableJson 類別提供了 whereTypewhereAllType 方法來執行此操作

1$response->assertJson(fn (AssertableJson $json) =>
2 $json->whereType('id', 'integer')
3 ->whereAllType([
4 'users.0.name' => 'string',
5 'meta' => 'array'
6 ])
7);

您可以使用 | 字元指定多個類型,或將類型陣列作為第二個參數傳遞給 whereType 方法。如果回應值是任何列出的類型,則斷言將成功

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

whereTypewhereAllType 方法識別以下類型:stringintegerdoublebooleanarraynull

測試檔案上傳

Illuminate\Http\UploadedFile 類別提供了 fake 方法,可用於產生用於測試的虛擬檔案或影像。這與 Storage facade 的 fake 方法相結合,大大簡化了檔案上傳的測試。例如,您可以結合這兩個功能來輕鬆測試頭像上傳表單

1<?php
2 
3use Illuminate\Http\UploadedFile;
4use Illuminate\Support\Facades\Storage;
5 
6test('avatars can be uploaded', function () {
7 Storage::fake('avatars');
8 
9 $file = UploadedFile::fake()->image('avatar.jpg');
10 
11 $response = $this->post('/avatar', [
12 'avatar' => $file,
13 ]);
14 
15 Storage::disk('avatars')->assertExists($file->hashName());
16});
1<?php
2 
3namespace Tests\Feature;
4 
5use Illuminate\Http\UploadedFile;
6use Illuminate\Support\Facades\Storage;
7use Tests\TestCase;
8 
9class ExampleTest extends TestCase
10{
11 public function test_avatars_can_be_uploaded(): void
12 {
13 Storage::fake('avatars');
14 
15 $file = UploadedFile::fake()->image('avatar.jpg');
16 
17 $response = $this->post('/avatar', [
18 'avatar' => $file,
19 ]);
20 
21 Storage::disk('avatars')->assertExists($file->hashName());
22 }
23}

如果您想斷言給定的檔案不存在,可以使用 Storage facade 提供的 assertMissing 方法

1Storage::fake('avatars');
2 
3// ...
4 
5Storage::disk('avatars')->assertMissing('missing.jpg');

偽造檔案自訂

使用 UploadedFile 類別提供的 fake 方法建立檔案時,您可以指定影像的寬度、高度和大小(以 KB 為單位),以便更好地測試應用程式的驗證規則

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

除了建立影像之外,您還可以使用 create 方法建立任何其他類型的檔案

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

如果需要,您可以將 $mimeType 引數傳遞給方法,以明確定義應由檔案傳回的 MIME 類型

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

測試視圖

Laravel 也允許您在不向應用程式發出模擬 HTTP 請求的情況下渲染視圖。若要完成此操作,您可以在測試中調用 view 方法。 view 方法接受視圖名稱和可選的資料陣列。該方法返回 Illuminate\Testing\TestView 的實例,該實例提供了幾種方法來方便地斷言視圖的內容

1<?php
2 
3test('a welcome view can be rendered', function () {
4 $view = $this->view('welcome', ['name' => 'Taylor']);
5 
6 $view->assertSee('Taylor');
7});
1<?php
2 
3namespace Tests\Feature;
4 
5use Tests\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 public function test_a_welcome_view_can_be_rendered(): void
10 {
11 $view = $this->view('welcome', ['name' => 'Taylor']);
12 
13 $view->assertSee('Taylor');
14 }
15}

TestView 類別提供了以下斷言方法:assertSeeassertSeeInOrderassertSeeTextassertSeeTextInOrderassertDontSeeassertDontSeeText

如果需要,您可以透過將 TestView 實例轉換為字串來取得原始的、渲染的視圖內容

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

共用錯誤

有些視圖可能依賴於Laravel 提供的全域錯誤包中共用的錯誤。若要使用錯誤訊息填充錯誤包,您可以使用 withViewErrors 方法

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

渲染 Blade 和組件

如有必要,您可以使用 blade 方法來評估和渲染原始的 Blade 字串。與 view 方法一樣,blade 方法返回 Illuminate\Testing\TestView 的實例

1$view = $this->blade(
2 '<x-component :name="$name" />',
3 ['name' => 'Taylor']
4);
5 
6$view->assertSee('Taylor');

您可以使用 component 方法來評估和渲染 Blade 組件component 方法返回 Illuminate\Testing\TestComponent 的實例

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

可用的斷言

回應斷言

Laravel 的 Illuminate\Testing\TestResponse 類別提供了各種自訂斷言方法,您可以在測試應用程式時使用這些方法。這些斷言可以在 jsongetpostputdelete 測試方法返回的回應中存取

assertBadRequest

斷言回應具有錯誤請求 (400) HTTP 狀態碼

1$response->assertBadRequest();

assertAccepted

斷言回應具有已接受 (202) HTTP 狀態碼

1$response->assertAccepted();

assertConflict

斷言回應具有衝突 (409) HTTP 狀態碼

1$response->assertConflict();

斷言回應包含給定的 Cookie

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

斷言回應包含給定的 Cookie 並且已過期

1$response->assertCookieExpired($cookieName);

斷言回應包含給定的 Cookie 並且未過期

1$response->assertCookieNotExpired($cookieName);

斷言回應不包含給定的 Cookie

1$response->assertCookieMissing($cookieName);

assertCreated

斷言回應具有 201 HTTP 狀態碼

1$response->assertCreated();

assertDontSee

斷言應用程式返回的回應中不包含給定的字串。此斷言將自動跳脫給定的字串,除非您傳遞 false 作為第二個引數

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

assertDontSeeText

斷言回應文字中不包含給定的字串。此斷言將自動跳脫給定的字串,除非您傳遞 false 作為第二個引數。此方法將在進行斷言之前將回應內容傳遞給 strip_tags PHP 函數

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

assertDownload

斷言回應是「下載」。通常,這表示調用的路由返回了 Response::download 回應、BinaryFileResponseStorage::download 回應

1$response->assertDownload();

如果您願意,您可以斷言可下載的檔案已指派給定的檔案名稱

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

assertExactJson

斷言回應包含給定 JSON 資料的精確比對

1$response->assertExactJson(array $data);

assertExactJsonStructure

斷言回應包含給定 JSON 結構的精確比對

1$response->assertExactJsonStructure(array $data);

此方法是 assertJsonStructure 的更嚴格變體。與 assertJsonStructure 相比,如果回應包含未明確包含在預期 JSON 結構中的任何索引鍵,則此方法將失敗。

assertForbidden

斷言回應具有禁止 (403) HTTP 狀態碼

1$response->assertForbidden();

assertFound

斷言回應具有找到 (302) HTTP 狀態碼

1$response->assertFound();

assertGone

斷言回應具有已消失 (410) HTTP 狀態碼

1$response->assertGone();

assertHeader

斷言給定的標頭和值存在於回應中

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

assertHeaderMissing

斷言給定的標頭不存在於回應中

1$response->assertHeaderMissing($headerName);

assertInternalServerError

斷言回應具有「伺服器內部錯誤」(500) HTTP 狀態碼

1$response->assertInternalServerError();

assertJson

斷言回應包含給定的 JSON 資料

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

assertJson 方法將回應轉換為陣列,以驗證給定的陣列是否存在於應用程式返回的 JSON 回應中。因此,如果 JSON 回應中還有其他屬性,只要給定的片段存在,此測試仍會通過。

assertJsonCount

斷言回應 JSON 在給定的索引鍵處具有具有預期項目數量的陣列

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

assertJsonFragment

斷言回應在回應中的任何位置都包含給定的 JSON 資料

1Route::get('/users', function () {
2 return [
3 'users' => [
4 [
5 'name' => 'Taylor Otwell',
6 ],
7 ],
8 ];
9});
10 
11$response->assertJsonFragment(['name' => 'Taylor Otwell']);

assertJsonIsArray

斷言回應 JSON 是陣列

1$response->assertJsonIsArray();

assertJsonIsObject

斷言回應 JSON 是物件

1$response->assertJsonIsObject();

assertJsonMissing

斷言回應不包含給定的 JSON 資料

1$response->assertJsonMissing(array $data);

assertJsonMissingExact

斷言回應不包含精確的 JSON 資料

1$response->assertJsonMissingExact(array $data);

assertJsonMissingValidationErrors

斷言回應對於給定的索引鍵沒有 JSON 驗證錯誤

1$response->assertJsonMissingValidationErrors($keys);

更通用的 assertValid 方法可用於斷言回應沒有作為 JSON 返回的驗證錯誤,並且沒有錯誤閃爍到 session 儲存。

assertJsonPath

斷言回應在指定的路徑中包含給定的資料

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

例如,如果您的應用程式返回以下 JSON 回應

1{
2 "user": {
3 "name": "Steve Schoger"
4 }
5}

您可以斷言 user 物件的 name 屬性與給定的值相符,如下所示

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

assertJsonMissingPath

斷言回應不包含給定的路徑

1$response->assertJsonMissingPath($path);

例如,如果您的應用程式返回以下 JSON 回應

1{
2 "user": {
3 "name": "Steve Schoger"
4 }
5}

您可以斷言它不包含 user 物件的 email 屬性

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

assertJsonStructure

斷言回應具有給定的 JSON 結構

1$response->assertJsonStructure(array $structure);

例如,如果您的應用程式返回的 JSON 回應包含以下資料

1{
2 "user": {
3 "name": "Steve Schoger"
4 }
5}

您可以斷言 JSON 結構符合您的期望,如下所示

1$response->assertJsonStructure([
2 'user' => [
3 'name',
4 ]
5]);

有時,您的應用程式返回的 JSON 回應可能包含物件陣列

1{
2 "user": [
3 {
4 "name": "Steve Schoger",
5 "age": 55,
6 "location": "Earth"
7 },
8 {
9 "name": "Mary Schoger",
10 "age": 60,
11 "location": "Earth"
12 }
13 ]
14}

在這種情況下,您可以使用 * 字元來斷言陣列中所有物件的結構

1$response->assertJsonStructure([
2 'user' => [
3 '*' => [
4 'name',
5 'age',
6 'location'
7 ]
8 ]
9]);

assertJsonValidationErrors

斷言回應對於給定的索引鍵具有給定的 JSON 驗證錯誤。當斷言針對作為 JSON 結構而不是閃爍到 session 的驗證錯誤返回的回應時,應使用此方法

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

更通用的 assertInvalid 方法可用於斷言回應具有作為 JSON 返回的驗證錯誤,錯誤已閃爍到 session 儲存。

assertJsonValidationErrorFor

斷言回應對於給定的索引鍵具有任何 JSON 驗證錯誤

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

assertMethodNotAllowed

斷言回應具有不允許的方法 (405) HTTP 狀態碼

1$response->assertMethodNotAllowed();

assertMovedPermanently

斷言回應具有永久移動 (301) HTTP 狀態碼

1$response->assertMovedPermanently();

assertLocation

斷言回應在 Location 標頭中具有給定的 URI 值

1$response->assertLocation($uri);

assertContent

斷言給定的字串與回應內容相符

1$response->assertContent($value);

assertNoContent

斷言回應具有給定的 HTTP 狀態碼且沒有內容

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

assertStreamedContent

斷言給定的字串與串流回應內容相符

1$response->assertStreamedContent($value);

assertNotFound

斷言回應具有未找到 (404) HTTP 狀態碼

1$response->assertNotFound();

assertOk

斷言回應具有 200 HTTP 狀態碼

1$response->assertOk();

assertPaymentRequired

斷言回應具有需要付款 (402) HTTP 狀態碼

1$response->assertPaymentRequired();

斷言回應包含給定的未加密 Cookie

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

assertRedirect

斷言回應是重新導向到給定的 URI

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

assertRedirectContains

斷言回應是否重新導向到包含給定字串的 URI

1$response->assertRedirectContains($string);

assertRedirectToRoute

斷言回應是重新導向到給定的具名路由

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

assertRedirectToSignedRoute

斷言回應是重新導向到給定的簽名路由

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

assertRequestTimeout

斷言回應具有請求逾時 (408) HTTP 狀態碼

1$response->assertRequestTimeout();

assertSee

斷言回應中包含給定的字串。此斷言將自動跳脫給定的字串,除非您傳遞 false 作為第二個引數

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

assertSeeInOrder

斷言給定的字串按順序包含在回應中。此斷言將自動跳脫給定的字串,除非您傳遞 false 作為第二個引數

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

assertSeeText

斷言回應文字中包含給定的字串。此斷言將自動跳脫給定的字串,除非您傳遞 false 作為第二個引數。回應內容將在進行斷言之前傳遞給 strip_tags PHP 函數

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

assertSeeTextInOrder

斷言給定的字串按順序包含在回應文字中。此斷言將自動跳脫給定的字串,除非您傳遞 false 作為第二個引數。回應內容將在進行斷言之前傳遞給 strip_tags PHP 函數

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

assertServerError

斷言回應具有伺服器錯誤 (>= 500 , < 600) HTTP 狀態碼

1$response->assertServerError();

assertServiceUnavailable

斷言回應具有「服務無法使用」(503) HTTP 狀態碼

1$response->assertServiceUnavailable();

assertSessionHas

斷言 session 包含給定的資料片段

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

如果需要,可以提供一個 closure 作為 assertSessionHas 方法的第二個引數。如果 closure 返回 true,則斷言將通過

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

assertSessionHasInput

斷言 session 在閃爍的輸入陣列中具有給定的值

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

如果需要,可以提供一個 closure 作為 assertSessionHasInput 方法的第二個引數。如果 closure 返回 true,則斷言將通過

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

assertSessionHasAll

斷言 session 包含給定的索引鍵/值配對陣列

1$response->assertSessionHasAll(array $data);

例如,如果您的應用程式的 session 包含 namestatus 索引鍵,您可以斷言這兩個索引鍵都存在並且具有指定的值,如下所示

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

assertSessionHasErrors

斷言 session 對於給定的 $keys 包含錯誤。如果 $keys 是關聯陣列,則斷言 session 對於每個欄位 (索引鍵) 包含特定的錯誤訊息 (值)。當測試將驗證錯誤閃爍到 session 而不是將它們作為 JSON 結構返回的路由時,應使用此方法

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

例如,若要斷言 nameemail 欄位具有閃爍到 session 的驗證錯誤訊息,您可以調用 assertSessionHasErrors 方法,如下所示

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

或者,您可以斷言給定的欄位具有特定的驗證錯誤訊息

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

更通用的 assertInvalid 方法可用於斷言回應具有作為 JSON 返回的驗證錯誤,錯誤已閃爍到 session 儲存。

assertSessionHasErrorsIn

斷言 session 在特定的錯誤包中對於給定的 $keys 包含錯誤。如果 $keys 是關聯陣列,則斷言 session 在錯誤包中對於每個欄位 (索引鍵) 包含特定的錯誤訊息 (值)

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

assertSessionHasNoErrors

斷言 session 沒有驗證錯誤

1$response->assertSessionHasNoErrors();

assertSessionDoesntHaveErrors

斷言 session 對於給定的索引鍵沒有驗證錯誤

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

更通用的 assertValid 方法可用於斷言回應沒有作為 JSON 返回的驗證錯誤,並且沒有錯誤閃爍到 session 儲存。

assertSessionMissing

斷言 session 不包含給定的索引鍵

1$response->assertSessionMissing($key);

assertStatus

斷言回應具有給定的 HTTP 狀態碼

1$response->assertStatus($code);

assertSuccessful

斷言回應具有成功 (>= 200 且 < 300) HTTP 狀態碼

1$response->assertSuccessful();

assertTooManyRequests

斷言回應具有過多請求 (429) HTTP 狀態碼

1$response->assertTooManyRequests();

assertUnauthorized

斷言回應具有未經授權 (401) HTTP 狀態碼

1$response->assertUnauthorized();

assertUnprocessable

斷言回應具有無法處理的實體 (422) HTTP 狀態碼

1$response->assertUnprocessable();

assertUnsupportedMediaType

斷言回應具有不支援的媒體類型 (415) HTTP 狀態碼

1$response->assertUnsupportedMediaType();

assertValid

斷言回應對於給定的索引鍵沒有驗證錯誤。此方法可用於斷言針對驗證錯誤作為 JSON 結構返回或驗證錯誤已閃爍到 session 的回應

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

assertInvalid

斷言回應對於給定的索引鍵具有驗證錯誤。此方法可用於斷言針對驗證錯誤作為 JSON 結構返回或驗證錯誤已閃爍到 session 的回應

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

您也可以斷言給定的索引鍵具有特定的驗證錯誤訊息。這樣做時,您可以提供完整的訊息或僅提供訊息的一小部分

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

assertViewHas

斷言回應視圖包含給定的資料片段

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

將閉包作為 assertViewHas 方法的第二個參數傳遞,將允許您檢查並針對特定的視圖資料進行斷言。

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

此外,視圖資料可以作為回應中的陣列變數存取,讓您可以方便地檢查它。

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

assertViewHasAll

斷言回應視圖具有給定的資料列表。

1$response->assertViewHasAll(array $data);

這個方法可以用於斷言視圖僅包含與給定鍵值相符的資料。

1$response->assertViewHasAll([
2 'name',
3 'email',
4]);

或者,您可以斷言視圖資料存在且具有特定值。

1$response->assertViewHasAll([
2 'name' => 'Taylor Otwell',
3 'email' => '[email protected],',
4]);

assertViewIs

斷言給定的視圖是由路由返回的。

1$response->assertViewIs($value);

assertViewMissing

斷言給定的資料鍵未提供給在應用程式回應中返回的視圖。

1$response->assertViewMissing($key);

身份驗證斷言

Laravel 也提供了各種與身份驗證相關的斷言,您可以在應用程式的功能測試中使用。請注意,這些方法是在測試類別本身上調用的,而不是由諸如 getpost 等方法返回的 Illuminate\Testing\TestResponse 實例。

assertAuthenticated

斷言使用者已通過身份驗證。

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

assertGuest

斷言使用者未通過身份驗證。

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

assertAuthenticatedAs

斷言特定使用者已通過身份驗證。

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

驗證斷言

Laravel 提供了兩個主要的與驗證相關的斷言,您可以使用它們來確保在您的請求中提供的資料是有效的或無效的。

assertValid

斷言回應對於給定的索引鍵沒有驗證錯誤。此方法可用於斷言針對驗證錯誤作為 JSON 結構返回或驗證錯誤已閃爍到 session 的回應

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

assertInvalid

斷言回應對於給定的索引鍵具有驗證錯誤。此方法可用於斷言針對驗證錯誤作為 JSON 結構返回或驗證錯誤已閃爍到 session 的回應

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

您也可以斷言給定的索引鍵具有特定的驗證錯誤訊息。這樣做時,您可以提供完整的訊息或僅提供訊息的一小部分

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

Laravel 是最有效率的方式來
建構、部署和監控軟體。