HTTP 測試
📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本
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);
}
}
一般來說,您的每個測試只應向應用程式發出一個請求。如果在單個測試方法中執行多個請求,可能會發生意外的行為。
[!NOTE] 為了方便,在運行測試時會自動禁用 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('/');
//
}
}
會話/認證
Laravel 提供了多種在 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('/');
//
}
}
Laravel 的會話通常用於維護當前已認證使用者的狀態。因此,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');
如果您希望確保請求是未認證的,可以使用 actingAsGuest 方法:
$this->actingAsGuest();
調試回應
向應用程式發出測試請求後,dump、dumpHeaders 和 dumpSession 方法可用於檢查和調試回應內容:
<?php
test('basic test', function () {
$response = $this->get('/');
$response->dump();
$response->dumpHeaders();
$response->dumpSession();
});
<?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->dump();
$response->dumpHeaders();
$response->dumpSession();
}
}
或者,您可以使用 dd、ddHeaders、ddBody、ddJson 和 ddSession 方法來傾印有關回應的資訊,然後停止執行:
<?php
test('basic test', function () {
$response = $this->get('/');
$response->dd();
$response->ddHeaders();
$response->ddBody();
$response->ddJson();
$response->ddSession();
});
<?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->dd();
$response->ddHeaders();
$response->ddBody();
$response->ddJson();
$response->ddSession();
}
}
異常處理
有時您可能需要測試您的應用程式是否拋出了特定的異常。為此,您可以透過 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');
// 斷言已拋出異常...
Exceptions::assertReported(InvalidOrderException::class);
// 對異常進行斷言...
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('/');
// 斷言已拋出異常...
Exceptions::assertReported(InvalidOrderException::class);
// 對異常進行斷言...
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;
);
assertDoesntThrow 方法可用於斷言給定閉包中的代碼未拋出任何異常:
$this->assertDoesntThrow(fn () => (new ProcessOrder)->execute());
測試 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']);
[!NOTE]
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);
如果您需要一次斷言多個 JSON 路徑,可以使用 assertJsonPaths 方法。每個路徑的預期值也可以是一個閉包:
$response->assertJsonPaths([
'team.owner.name' => 'Darian',
'team.owner.email' => fn (string $email) => str($email)->is('*@laravel.com'),
'team.members.0.name' => 'Sally',
]);
您可以使用 assertJsonMissingPaths 方法來斷言回應中缺少多個 JSON 路徑:
$response->assertJsonMissingPaths([
'team.owner.password',
'team.members.0.api_token',
]);
流暢 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')
->where('email', fn (string $email) => str($email)->is('[email protected]'))
->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('[email protected]'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
}
了解 etc 方法
在上面的範例中,您可能已經注意到我們在斷言鏈的末尾呼叫了 etc 方法。此方法通知 Laravel JSON 物件上可能還有其他屬性。如果未使用 etc 方法,則如果 JSON 物件上存在您未進行斷言的其他屬性,測試將失敗。
此行為背後的意圖是透過強制您明確地對屬性進行斷言或透過 etc 方法明確允許其他屬性,來保護您免於在 JSON 回應中無意間暴露敏感資訊。
但是,您應該知道,在斷言鏈中不包含 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('[email protected]'))
->missing('password')
->etc()
)
);
如果您希望對 JSON 集合中的每個項目進行相同的斷言,可以使用 each 方法:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has(3)
->each(fn (AssertableJson $json) =>
$json->whereType('id', 'integer')
->whereType('name', 'string')
->whereType('email', 'string')
->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('[email protected]'))
->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('[email protected]'))
->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());
}
}
如果您希望斷言給定的檔案不存在,可以使用 Storage 外觀提供的 assertMissing 方法:
Storage::fake('avatars');
// ...
Storage::disk('avatars')->assertMissing('missing.jpg');
虛擬檔案自訂
使用 UploadedFile 類別提供的 fake 方法建立檔案時,您可以指定圖像的寬度、高度和大小(以千位元組為單位),以更好地測試應用程式的驗證規則:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
除了建立圖像外,您還可以使用 create 方法建立任何其他類型的檔案:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
如果需要,您可以向該方法傳遞一個 $mimeType 參數來明確定義檔案應返回的 MIME 類型:
UploadedFile::fake()->create(
'document.pdf', $sizeInKilobytes, 'application/pdf'
);
測試視圖
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(
' ',
['name' => 'Taylor']
);
$view->assertSee('Taylor');
您可以使用 component 方法來評估和渲染 Blade 元件。component 方法返回一個 Illuminate\Testing\TestComponent 的實例:
$view = $this->component(Profile::class, ['name' => 'Taylor']);
$view->assertSee('Taylor');
快取路由
在測試運行之前,Laravel 會啟動一個應用程式的新實例,包括收集所有已定義的路由。如果您的應用程式有很多路由檔案,您可能希望將 Illuminate\Foundation\Testing\WithCachedRoutes trait 添加到您的測試案例中。在使用此 trait 的測試中,路由只會被建立一次並存儲在記憶體中,這意味著路由收集過程只會在您的測試套件中的所有測試中運行一次:
<?php
use App\Http\Controllers\UserController;
use Illuminate\Foundation\Testing\WithCachedRoutes;
pest()->use(WithCachedRoutes::class);
test('basic example', function () {
$this->get(action([UserController::class, 'index']));
// ...
});
<?php
namespace Tests\Feature;
use App\Http\Controllers\UserController;
use Illuminate\Foundation\Testing\WithCachedRoutes;
use Tests\TestCase;
class BasicTest extends TestCase
{
use WithCachedRoutes;
/**
* A basic functional test example.
*/
public function test_basic_example(): void
{
$response = $this->get(action([UserController::class, 'index']));
// ...
}
}
可用斷言
回應斷言
Laravel 的 Illuminate\Testing\TestResponse 類別提供了多種自訂斷言方法,您可以在測試應用程式時使用它們。這些斷言可以在 json、get、post、put 和 delete 測試方法返回的回應上存取:
assertAccepted assertBadRequest assertClientError assertConflict assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson assertExactJsonStructure assertFailedDependency assertForbidden assertFound assertGone assertHeader assertHeaderContains assertHeaderMissing assertInternalServerError assertJson assertJsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonPaths assertJsonMissingPath assertJsonMissingPaths assertJsonStructure assertJsonValidationErrors assertJsonValidationErrorFor assertLocation assertMethodNotAllowed assertMovedPermanently assertContent assertNoContent assertStreamed assertStreamedContent assertNotFound assertOk assertPaymentRequired assertPlainCookie assertRedirect assertRedirectBack assertRedirectBackWithErrors assertRedirectBackWithoutErrors assertRedirectContains assertRedirectToRoute assertRedirectToSignedRoute assertRequestTimeout assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertServerError assertServiceUnavailable assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertSessionMissingInput assertStatus assertSuccessful assertTooManyRequests assertUnauthorized assertUnprocessable assertUnsupportedMediaType assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertViewMissing
assertAccepted
斷言回應具有 accepted (202) HTTP 狀態碼:
$response->assertAccepted();
assertBadRequest
斷言回應具有 bad request (400) HTTP 狀態碼:
$response->assertBadRequest();
assertClientError
斷言回應具有 client error (>= 400, < 500) HTTP 狀態碼:
$response->assertClientError();
assertConflict
斷言回應具有 conflict (409) HTTP 狀態碼:
$response->assertConflict();
assertCookie
斷言回應包含給定的 cookie:
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
斷言回應包含給定的 cookie 且已過期:
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
斷言回應包含給定的 cookie 且未過期:
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
斷言回應不包含給定的 cookie:
$response->assertCookieMissing($cookieName);
assertCreated
斷言回應具有 201 HTTP 狀態碼:
$response->assertCreated();
assertDontSee
斷言給定的字串不包含在應用程式返回的回應中。除非您傳遞第二個參數 false,否則此斷言將自動轉義給定的字串:
$response->assertDontSee($value, $escape = true);
assertDontSeeText
斷言給定的字串不包含在回應文字中。除非您傳遞第二個參數 false,否則此斷言將自動轉義給定的字串。在進行斷言之前,回應內容將被傳遞給 strip_tags PHP 函數:
$response->assertDontSeeText($value, $escape = 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 結構中的任何鍵,則此方法將失敗。
assertFailedDependency
斷言回應具有 failed dependency (424) HTTP 狀態碼:
$response->assertFailedDependency();
assertForbidden
斷言回應具有 forbidden (403) HTTP 狀態碼:
$response->assertForbidden();
assertFound
斷言回應具有 found (302) HTTP 狀態碼:
$response->assertFound();
assertGone
斷言回應具有 gone (410) HTTP 狀態碼:
$response->assertGone();
assertHeader
斷言回應上存在給定的頁頭和值:
$response->assertHeader($headerName, $value = null);
assertHeaderContains
斷言給定的頁頭包含給定的子字串值:
$response->assertHeaderContains($headerName, $value);
assertHeaderMissing
斷言回應上不存在給定的頁頭:
$response->assertHeaderMissing($headerName);
assertInternalServerError
斷言回應具有「Internal Server Error」(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);
[!NOTE] 更通用的 assertValid 方法可用於斷言回應沒有作為 JSON 返回的驗證錯誤並且沒有錯誤被閃現到會話儲存中。
assertJsonPath
斷言回應在指定路徑包含給定資料:
$response->assertJsonPath($path, $expectedValue);
例如,如果您的應用程式返回以下 JSON 回應:
{
"user": {
"name": "Steve Schoger"
}
}
您可以斷言 user 物件的 name 屬性與給定值匹配,像這樣:
$response->assertJsonPath('user.name', 'Steve Schoger');
assertJsonPaths
斷言回應在指定路徑包含給定資料:
$response->assertJsonPaths(array $paths);
例如,您可以一次斷言回應中的多個值:
$response->assertJsonPaths([
'user.name' => 'Steve Schoger',
'user.email' => fn (string $email) => str($email)->endsWith('@laravel.com'),
]);
assertJsonMissingPath
斷言回應不包含給定的路徑:
$response->assertJsonMissingPath($path);
例如,如果您的應用程式返回以下 JSON 回應:
{
"user": {
"name": "Steve Schoger"
}
}
您可以斷言它不包含 user 物件的 email 屬性:
$response->assertJsonMissingPath('user.email');
assertJsonMissingPaths
斷言回應不包含給定的路徑:
$response->assertJsonMissingPaths($paths);
例如,您可以斷言回應中缺少多個路徑:
$response->assertJsonMissingPaths([
'user.email',
'user.password',
]);
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');
[!NOTE] 更通用的 assertInvalid 方法可用於斷言回應具有作為 JSON 返回的驗證錯誤或錯誤已閃現到會話儲存。
assertJsonValidationErrorFor
斷言回應具有給定鍵的任何 JSON 驗證錯誤:
$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');
assertMethodNotAllowed
斷言回應具有 method not allowed (405) HTTP 狀態碼:
$response->assertMethodNotAllowed();
assertMovedPermanently
斷言回應具有 moved permanently (301) HTTP 狀態碼:
$response->assertMovedPermanently();
assertLocation
斷言回應在 Location 頁頭中具有給定的 URI 值:
$response->assertLocation($uri);
assertContent
斷言給定的字串與回應內容匹配:
$response->assertContent($value);
assertNoContent
斷言回應具有給定的 HTTP 狀態碼且無內容:
$response->assertNoContent($status = 204);
assertStreamed
斷言回應是一個串流回應:
$response->assertStreamed();
assertStreamedContent
斷言給定的字串與串流回應內容匹配:
$response->assertStreamedContent($value);
assertNotFound
斷言回應具有 not found (404) HTTP 狀態碼:
$response->assertNotFound();
assertOk
斷言回應具有 200 HTTP 狀態碼:
$response->assertOk();
assertPaymentRequired
斷言回應具有 payment required (402) HTTP 狀態碼:
$response->assertPaymentRequired();
assertPlainCookie
斷言回應包含給定的未加密 cookie:
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
斷言回應重定向到給定的 URI:
$response->assertRedirect($uri = null);
assertRedirectBack
斷言回應是否重定向回上一頁:
$response->assertRedirectBack();
assertRedirectBackWithErrors
斷言回應是否重定向回上一頁且會話具有給定的錯誤:
$response->assertRedirectBackWithErrors(
array $keys = [], $format = null, $errorBag = 'default'
);
assertRedirectBackWithoutErrors
斷言回應是否重定向回上一頁且會話不包含任何錯誤訊息:
$response->assertRedirectBackWithoutErrors();
assertRedirectContains
斷言回應是否重定向到包含給定字串的 URI:
$response->assertRedirectContains($string);
assertRedirectToRoute
斷言回應重定向到給定的命名路由:
$response->assertRedirectToRoute($name, $parameters = []);
assertRedirectToSignedRoute
斷言回應重定向到給定的簽名路由:
$response->assertRedirectToSignedRoute($name = null, $parameters = []);
assertRequestTimeout
斷言回應具有 request timeout (408) HTTP 狀態碼:
$response->assertRequestTimeout();
assertSee
斷言給定的字串包含在回應中。除非您傳遞第二個參數 false,否則此斷言將自動轉義給定的字串:
$response->assertSee($value, $escape = true);
assertSeeInOrder
斷言給定的字串按順序包含在回應中。除非您傳遞第二個參數 false,否則此斷言將自動轉義給定的字串:
$response->assertSeeInOrder(array $values, $escape = true);
assertSeeText
斷言給定的字串包含在回應文字中。除非您傳遞第二個參數 false,否則此斷言將自動轉義給定的字串。在進行斷言之前,回應內容將被傳遞給 strip_tags PHP 函數:
$response->assertSeeText($value, $escape = true);
assertSeeTextInOrder
斷言給定的字串按順序包含在回應文字中。除非您傳遞第二個參數 false,否則此斷言將自動轉義給定的字串。在進行斷言之前,回應內容將被傳遞給 strip_tags PHP 函數:
$response->assertSeeTextInOrder(array $values, $escape = true);
assertServerError
斷言回應具有 server error (>= 500 , < 600) HTTP 狀態碼:
$response->assertServerError();
assertServiceUnavailable
斷言回應具有「Service Unavailable」(503) HTTP 狀態碼:
$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.'
]);
[!NOTE] 更通用的 assertInvalid 方法可用於斷言回應具有作為 JSON 返回的驗證錯誤或錯誤已閃現到會話儲存。
assertSessionHasErrorsIn
斷言會話在特定錯誤袋中包含給定 $keys 的錯誤。如果 $keys 是一個關聯陣列,則斷言會話在錯誤袋中包含每個欄位(鍵)的特定錯誤訊息(值):
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
斷言會話沒有驗證錯誤:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
斷言會話沒有給定鍵的驗證錯誤:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
[!NOTE] 更通用的 assertValid 方法可用於斷言回應沒有作為 JSON 返回的驗證錯誤並且沒有錯誤被閃現到會話儲存。
assertSessionMissing
斷言會話不包含給定的鍵:
$response->assertSessionMissing($key);
assertSessionMissingInput
斷言會話在閃現輸入陣列中缺少給定的輸入鍵:
$response->assertSessionMissingInput($key);
assertStatus
斷言回應具有給定的 HTTP 狀態碼:
$response->assertStatus($code);
assertSuccessful
斷言回應具有 successful (>= 200 且 < 300) HTTP 狀態碼:
$response->assertSuccessful();
assertTooManyRequests
斷言回應具有 too many requests (429) HTTP 狀態碼:
$response->assertTooManyRequests();
assertUnauthorized
斷言回應具有 unauthorized (401) HTTP 狀態碼:
$response->assertUnauthorized();
assertUnprocessable
斷言回應具有 unprocessable entity (422) HTTP 狀態碼:
$response->assertUnprocessable();
assertUnsupportedMediaType
斷言回應具有 unsupported media type (415) HTTP 狀態碼:
$response->assertUnsupportedMediaType();
assertValid
斷言回應沒有給定鍵的驗證錯誤。此方法可用於對驗證錯誤作為 JSON 結構返回或驗證錯誤已閃現到會話的回應進行斷言:
// 斷言不存在驗證錯誤...
$response->assertValid();
// 斷言給定的鍵沒有驗證錯誤...
$response->assertValid(['name', 'email']);
assertInvalid
斷言回應具有給定鍵的驗證錯誤。此方法可用於對驗證錯誤作為 JSON 結構返回或驗證錯誤已閃現到會話的回應進行斷言:
$response->assertInvalid(['name', 'email']);
您還可以斷言給定的鍵具有特定的驗證錯誤訊息。這樣做時,您可以提供完整的訊息或只提供訊息的一小部分:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);