HTTP 測試
簡介
Laravel 提供了一個非常流暢的 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
方法向應用程式發出 GET
請求,而 assertStatus
方法斷言返回的回應應具有給定的 HTTP 狀態碼。除了這個簡單的斷言之外,Laravel 還包含各種斷言,用於檢查回應標頭、內容、JSON 結構等等。
發出請求
要向您的應用程式發出請求,您可以在測試中調用 get
、post
、put
、patch
或 delete
方法。這些方法實際上不會向您的應用程式發出「真實」的 HTTP 請求。相反,整個網路請求會在內部模擬。
測試請求方法不會返回 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); }}
Cookies
您可以使用 withCookie
或 withCookies
方法在發出請求之前設定 Cookie 值。withCookie
方法接受 Cookie 名稱和值作為其兩個引數,而 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('/'); // }}
Session / 身份驗證
Laravel 提供了幾個輔助函式,用於在 HTTP 測試期間與 Session 互動。首先,您可以使用 withSession
方法將 Session 資料設定為給定的陣列。這對於在向您的應用程式發出請求之前載入 Session 資料很有用
<?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('/'); // }}
Laravel 的 Session 通常用於維護目前已驗證使用者的狀態。因此,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(); }}
例外處理
有時您可能需要測試您的應用程式是否拋出特定的例外。為此,您可以透過 Exceptions
外觀模式「偽造」例外處理常式。在偽造例外處理常式後,您可以使用 assertReported
和 assertNotReported
方法針對請求期間拋出的例外進行斷言
<?php use App\Exceptions\InvalidOrderException;use Illuminate\Support\Facades\Exceptions; test('exception is thrown', function () { Exceptions::fake(); $response = $this->get('/order/1'); // Assert an exception was thrown... Exceptions::assertReported(InvalidOrderException::class); // Assert against the exception... Exceptions::assertReported(function (InvalidOrderException $e) { return $e->getMessage() === 'The order was invalid.'; });});
<?php namespace Tests\Feature; use App\Exceptions\InvalidOrderException;use Illuminate\Support\Facades\Exceptions;use Tests\TestCase; class ExampleTest extends TestCase{ /** * A basic test example. */ public function test_exception_is_thrown(): void { Exceptions::fake(); $response = $this->get('/'); // Assert an exception was thrown... Exceptions::assertReported(InvalidOrderException::class); // Assert against the exception... Exceptions::assertReported(function (InvalidOrderException $e) { return $e->getMessage() === 'The order was invalid.'; }); }}
assertNotReported
和 assertNothingReported
方法可用於斷言在請求期間未拋出給定例外,或未拋出任何例外
Exceptions::assertNotReported(InvalidOrderException::class); Exceptions::assertNothingReported();
您可以通過在發出請求之前調用 withoutExceptionHandling
方法來完全停用給定請求的例外處理
$response = $this->withoutExceptionHandling()->get('/');
此外,如果您想確保您的應用程式未使用 PHP 語言或您的應用程式正在使用的程式庫中已棄用的功能,您可以在發出請求之前調用 withoutDeprecationHandling
方法。停用棄用處理時,棄用警告將轉換為例外,從而導致測試失敗
$response = $this->withoutDeprecationHandling()->get('/');
assertThrows
方法可用於斷言給定閉包中的程式碼會拋出指定類型的例外
$this->assertThrows( fn () => (new ProcessOrder)->execute(), OrderInvalid::class);
如果您想檢查並針對拋出的例外進行斷言,您可以提供一個閉包作為 assertThrows
方法的第二個引數
$this->assertThrows( fn () => (new ProcessOrder)->execute(), fn (OrderInvalid $e) => $e->orderId() === 123;);
測試 JSON API
Laravel 還提供了幾個輔助函式,用於測試 JSON API 及其回應。例如,可以使用 json
、getJson
、postJson
、putJson
、patchJson
、deleteJson
和 optionsJson
方法發出具有各種 HTTP 動詞的 JSON 請求。您也可以輕鬆地將資料和標頭傳遞給這些方法。首先,讓我們編寫一個測試,以向 /api/user
發出 POST
請求,並斷言返回了預期的 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
方法會將回應轉換為陣列,以驗證給定的陣列是否存在於應用程式傳回的 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);
Fluent JSON 測試
Laravel 還提供了一種優美的方式,可以流暢地測試應用程式的 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') ->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') ->whereNot('status', 'pending') ->missing('password') ->etc() );}
了解 etc
方法
在上面的範例中,您可能已經注意到我們在斷言鏈的末尾調用了 etc
方法。此方法會通知 Laravel 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') ->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') ->missing('password') ->etc() ) );
然而,您可以只呼叫一次 has
方法並將閉包作為其第三個參數,而不是呼叫兩次 has
方法來斷言 users
集合。這樣做時,閉包會自動被調用並將範圍設定為集合中的第一個項目
$response ->assertJson(fn (AssertableJson $json) => $json->has('meta') ->has('users', 3, fn (AssertableJson $json) => $json->where('id', 1) ->where('name', 'Victoria Faith') ->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
facade 的 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()); }}
如果您想斷言給定的檔案不存在,可以使用 Storage
facade 提供的 assertMissing
方法
Storage::fake('avatars'); // ... Storage::disk('avatars')->assertMissing('missing.jpg');
虛擬檔案自訂
當使用 UploadedFile
類別提供的 fake
方法建立檔案時,您可以指定影像的寬度、高度和大小(以 KB 為單位),以便更好地測試應用程式的驗證規則
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');
測試視圖
Laravel 還允許您在不向應用程式發出模擬 HTTP 請求的情況下渲染視圖。要完成此操作,您可以在測試中呼叫 view
方法。view
方法接受視圖名稱和可選的資料陣列。該方法會傳回一個 Illuminate\Testing\TestView
的實例,該實例提供多種方法,方便您對視圖的內容進行斷言
<?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');
分享錯誤
某些視圖可能依賴於Laravel 提供的全域錯誤袋中共享的錯誤。要使用錯誤訊息填充錯誤袋,您可以使用 withViewErrors
方法
$view = $this->withViewErrors([ 'name' => ['Please provide a valid name.']])->view('form'); $view->assertSee('Please provide a valid name.');
渲染 Blade 和元件
如有必要,您可以使用 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');
可用的斷言
回應斷言
Laravel 的 Illuminate\Testing\TestResponse
類別提供了各種自訂的斷言方法,您可以在測試應用程式時使用。這些斷言可以在 json
、get
、post
、put
和 delete
測試方法傳回的回應中存取
assertAccepted assertBadRequest assertConflict assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson assertExactJsonStructure assertForbidden assertFound assertGone assertHeader assertHeaderMissing assertInternalServerError assertJson assertJsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonMissingPath assertJsonStructure assertJsonValidationErrors assertJsonValidationErrorFor assertLocation assertMethodNotAllowed assertMovedPermanently assertContent assertNoContent assertStreamedContent assertNotFound assertOk assertPaymentRequired assertPlainCookie assertRedirect assertRedirectContains assertRedirectToRoute assertRedirectToSignedRoute assertRequestTimeout assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertServerError assertServiceUnavailable assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertStatus assertSuccessful assertTooManyRequests assertUnauthorized assertUnprocessable assertUnsupportedMediaType assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertViewMissing
assertBadRequest
斷言回應具有錯誤請求 (400) HTTP 狀態碼
$response->assertBadRequest();
assertAccepted
斷言回應具有已接受 (202) HTTP 狀態碼
$response->assertAccepted();
assertConflict
斷言回應具有衝突 (409) HTTP 狀態碼
$response->assertConflict();
assertCookie
斷言回應包含給定的 Cookie
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
斷言回應包含給定的 Cookie,且該 Cookie 已過期
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
斷言回應包含給定的 Cookie,且該 Cookie 未過期
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
斷言回應不包含給定的 Cookie
$response->assertCookieMissing($cookieName);
assertCreated
斷言回應具有 201 HTTP 狀態碼
$response->assertCreated();
assertDontSee
斷言應用程式傳回的回應中不包含給定的字串。除非您傳遞第二個引數 false
,否則此斷言將會自動跳脫給定的字串
$response->assertDontSee($value, $escaped = true);
assertDontSeeText
斷言回應文字中不包含給定的字串。除非您傳遞第二個引數 false
,否則此斷言將會自動跳脫給定的字串。此方法會在進行斷言之前將回應內容傳遞給 strip_tags
PHP 函式
$response->assertDontSeeText($value, $escaped = true);
assertDownload
斷言回應為「下載」。通常,這表示調用的路由傳回了 Response::download
回應、BinaryFileResponse
或 Storage::download
回應
$response->assertDownload();
如果您願意,您可以斷言可下載的檔案已被分配給定的檔案名稱
$response->assertDownload('image.jpg');
assertExactJson
斷言回應包含與給定 JSON 資料完全匹配的內容
$response->assertExactJson(array $data);
assertExactJsonStructure
斷言回應包含與給定 JSON 結構完全匹配的內容
$response->assertExactJsonStructure(array $data);
此方法是 assertJsonStructure 的更嚴格變體。與 assertJsonStructure
不同,如果回應包含任何未明確包含在預期 JSON 結構中的鍵,此方法將會失敗。
assertForbidden
斷言回應具有禁止 (403) HTTP 狀態碼
$response->assertForbidden();
assertFound
斷言回應具有找到 (302) HTTP 狀態碼
$response->assertFound();
assertGone
斷言回應具有已消失 (410) HTTP 狀態碼
$response->assertGone();
assertHeader
斷言回應中存在給定的標頭和值
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
斷言回應中不存在給定的標頭
$response->assertHeaderMissing($headerName);
assertInternalServerError
斷言回應具有「內部伺服器錯誤」 (500) HTTP 狀態碼
$response->assertInternalServerError();
assertJson
斷言回應包含給定的 JSON 資料
$response->assertJson(array $data, $strict = false);
assertJson
方法會將回應轉換為陣列,以驗證給定的陣列是否存在於應用程式傳回的 JSON 回應中。因此,如果 JSON 回應中有其他屬性,只要存在給定的片段,此測試仍然會通過。
assertJsonCount
斷言回應 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();
assertJsonMissing
斷言回應不包含給定的 JSON 資料
$response->assertJsonMissing(array $data);
assertJsonMissingExact
斷言回應不包含完全相同的 JSON 資料
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
斷言回應針對給定的鍵沒有 JSON 驗證錯誤
$response->assertJsonMissingValidationErrors($keys);
更通用的 assertValid 方法可用於斷言回應沒有以 JSON 形式傳回的驗證錯誤,且沒有錯誤被快閃到 session 儲存。
assertJsonPath
斷言回應在指定的路徑包含給定的資料
$response->assertJsonPath($path, $expectedValue);
例如,如果您的應用程式傳回以下 JSON 回應
{ "user": { "name": "Steve Schoger" }}
您可以斷言 user
物件的 name
屬性與給定的值相符,如下所示
$response->assertJsonPath('user.name', 'Steve Schoger');
assertJsonMissingPath
斷言回應不包含給定的路徑
$response->assertJsonMissingPath($path);
例如,如果您的應用程式傳回以下 JSON 回應
{ "user": { "name": "Steve Schoger" }}
您可以斷言它不包含 user
物件的 email
屬性
$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 結構傳回而不是快閃到 session 的回應進行斷言時,應使用此方法
$response->assertJsonValidationErrors(array $data, $responseKey = 'errors');
更通用的 assertInvalid 方法可用於斷言回應有以 JSON 形式傳回的驗證錯誤,或錯誤被快閃到 session 儲存。
assertJsonValidationErrorFor
斷言回應針對給定的鍵有任何 JSON 驗證錯誤
$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');
assertMethodNotAllowed
斷言回應具有方法不允許 (405) HTTP 狀態碼
$response->assertMethodNotAllowed();
assertMovedPermanently
斷言回應具有永久移動 (301) HTTP 狀態碼
$response->assertMovedPermanently();
assertLocation
斷言回應的 Location
標頭中具有給定的 URI 值
$response->assertLocation($uri);
assertContent
斷言給定的字串與回應內容相符
$response->assertContent($value);
assertNoContent
斷言回應具有給定的 HTTP 狀態碼且沒有內容
$response->assertNoContent($status = 204);
assertStreamedContent
斷言給定的字串與串流回應內容相符
$response->assertStreamedContent($value);
assertNotFound
斷言回應具有找不到 (404) HTTP 狀態碼
$response->assertNotFound();
assertOk
斷言回應具有 200 HTTP 狀態碼
$response->assertOk();
assertPaymentRequired
斷言回應具有需要付款 (402) HTTP 狀態碼
$response->assertPaymentRequired();
assertPlainCookie
斷言回應包含給定的未加密 Cookie
$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();
assertSee
斷言給定的字串包含在回應中。此斷言將自動跳脫給定的字串,除非您傳遞第二個參數 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();
assertServiceUnavailable
斷言回應具有「服務不可用」(503) HTTP 狀態碼
$response->assertServiceUnavailable();
assertSessionHas
斷言 session 包含給定的資料片段
$response->assertSessionHas($key, $value = null);
如果需要,可以將閉包作為第二個參數提供給 assertSessionHas
方法。如果閉包傳回 true
,則斷言將通過
$response->assertSessionHas($key, function (User $value) { return $value->name === 'Taylor Otwell';});
assertSessionHasInput
斷言 session 在快閃輸入陣列中具有給定的值
$response->assertSessionHasInput($key, $value = null);
如果需要,可以將閉包作為第二個參數提供給 assertSessionHasInput
方法。如果閉包傳回 true
,則斷言將通過
use Illuminate\Support\Facades\Crypt; $response->assertSessionHasInput($key, function (string $value) { return Crypt::decryptString($value) === 'secret';});
assertSessionHasAll
斷言 session 包含給定的鍵/值對陣列
$response->assertSessionHasAll(array $data);
例如,如果您的應用程式的 session 包含 name
和 status
鍵,您可以斷言這兩者都存在並具有指定的值,如下所示
$response->assertSessionHasAll([ 'name' => 'Taylor Otwell', 'status' => 'active',]);
assertSessionHasErrors
斷言 session 包含給定 $keys
的錯誤。如果 $keys
是關聯陣列,則斷言 session 針對每個欄位(鍵)包含特定的錯誤訊息(值)。當測試將驗證錯誤快閃到 session 而不是以 JSON 結構傳回它們的路由時,應使用此方法
$response->assertSessionHasErrors( array $keys = [], $format = null, $errorBag = 'default');
例如,要斷言 name
和 email
欄位具有快閃到 session 的驗證錯誤訊息,您可以如下調用 assertSessionHasErrors
方法
$response->assertSessionHasErrors(['name', 'email']);
或者,您可以斷言給定的欄位具有特定的驗證錯誤訊息
$response->assertSessionHasErrors([ 'name' => 'The given name was invalid.']);
更通用的 assertInvalid 方法可用於斷言回應有以 JSON 形式傳回的驗證錯誤,或錯誤被快閃到 session 儲存。
assertSessionHasErrorsIn
斷言 session 在特定的錯誤容器中包含給定 $keys
的錯誤。如果 $keys
是關聯陣列,則斷言 session 在錯誤容器中針對每個欄位(鍵)包含特定的錯誤訊息(值)
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
斷言 session 沒有驗證錯誤
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
斷言 session 針對給定的鍵沒有驗證錯誤
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
更通用的 assertValid 方法可用於斷言回應沒有以 JSON 形式傳回的驗證錯誤,且沒有錯誤被快閃到 session 儲存。
assertSessionMissing
斷言 session 不包含給定的鍵
$response->assertSessionMissing($key);
assertStatus
斷言回應具有給定的 HTTP 狀態碼
$response->assertStatus($code);
assertSuccessful
斷言回應具有成功的(>= 200 且 < 300)HTTP 狀態碼
$response->assertSuccessful();
assertTooManyRequests
斷言回應具有過多請求 (429) HTTP 狀態碼
$response->assertTooManyRequests();
assertUnauthorized
斷言回應具有未經授權 (401) HTTP 狀態碼
$response->assertUnauthorized();
assertUnprocessable
斷言回應具有無法處理的實體 (422) HTTP 狀態碼
$response->assertUnprocessable();
assertUnsupportedMediaType
斷言回應具有不支援的媒體類型 (415) HTTP 狀態碼
$response->assertUnsupportedMediaType();
assertValid
斷言回應針對給定的鍵沒有驗證錯誤。此方法可用於針對驗證錯誤以 JSON 結構傳回或驗證錯誤已快閃到 session 的回應進行斷言
// 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 結構傳回或驗證錯誤已快閃到 session 的回應進行斷言
$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',]);
或者,您可以斷言視圖資料存在並且具有特定值
$response->assertViewHasAll([ 'name' => 'Taylor Otwell',]);
assertViewIs
斷言給定的視圖是由路由傳回的
$response->assertViewIs($value);
assertViewMissing
斷言給定的資料鍵在應用程式的回應中未提供給視圖
$response->assertViewMissing($key);
身份驗證斷言
Laravel 還提供了各種與身份驗證相關的斷言,您可以在應用程式的功能測試中使用這些斷言。請注意,這些方法是在測試類別本身上調用的,而不是由 get
和 post
等方法傳回的 Illuminate\Testing\TestResponse
實例。
assertAuthenticated
斷言使用者已通過身份驗證
$this->assertAuthenticated($guard = null);
assertGuest
斷言使用者未通過身份驗證
$this->assertGuest($guard = null);
assertAuthenticatedAs
斷言特定使用者已通過身份驗證
$this->assertAuthenticatedAs($user, $guard = null);
驗證斷言
Laravel 提供了兩個主要的驗證相關斷言,您可以使用它們來確保您的請求中提供的資料有效或無效。
assertValid
斷言回應針對給定的鍵沒有驗證錯誤。此方法可用於針對驗證錯誤以 JSON 結構傳回或驗證錯誤已快閃到 session 的回應進行斷言
// 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 結構傳回或驗證錯誤已快閃到 session 的回應進行斷言
$response->assertInvalid(['name', 'email']);
您也可以斷言給定的鍵具有特定的驗證錯誤訊息。執行此操作時,您可以提供整個訊息或僅提供訊息的一小部分
$response->assertInvalid([ 'name' => 'The name field is required.', 'email' => 'valid email address',]);