HTTP 测试
Introduction
Laravel 提供了一个非常流畅的 API,用于向您的应用程序发出 HTTP 请求并检查响应。例如,看看下面定义的特性测试:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_a_basic_request(): 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
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
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
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
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
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
helper 方法提供了一种将给定用户验证为当前用户的简单方法。例如,我们可以使用一个模型厂 生成和验证用户:
<?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
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
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();
}
}
异常处理
有时您可能想测试您的应用程序是否抛出特定异常。为了确保异常不会被 Laravel 的异常处理程序捕获并作为 HTTP 响应返回,您可以调用withoutExceptionHandling
提出请求前的方法:
$response = $this->withoutExceptionHandling()->get('/');
此外,如果您想确保您的应用程序没有使用 PHP 语言或您的应用程序正在使用的库弃用的功能,您可以调用withoutDeprecationHandling
在提出请求之前的方法。禁用弃用处理时,弃用警告将转换为异常,从而导致测试失败:
$response = $this->withoutDeprecationHandling()->get('/');
测试 JSON API
Laravel 还提供了几个帮助程序来测试 JSON API 及其响应。例如,json
,getJson
,postJson
,putJson
,patchJson
,deleteJson
, 和optionsJson
方法可用于发出带有各种 HTTP 动词的 JSON 请求。您还可以轻松地将数据和标头传递给这些方法。首先,让我们编写一个测试来做一个POST
请求/api/user
并断言已返回预期的 JSON 数据:
<?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 响应中返回的各个值:
$this->assertTrue($response['created']);
Note
这assertJson
方法将响应转换为数组并利用PHPUnit::assertArraySubset
验证给定数组是否存在于应用程序返回的 JSON 响应中。因此,如果 JSON 响应中有其他属性,只要给定片段存在,此测试仍会通过。
断言精确的 JSON 匹配
如前所述,assertJson
方法可用于断言 JSON 片段存在于 JSON 响应中。如果您想验证给定的数组完全匹配 您的应用程序返回的 JSON,您应该使用assertExactJson
方法:
<?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
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 测试
Laravel 还提供了一种漂亮的方式来流畅地测试应用程序的 JSON 响应。首先,将闭包传递给assertJson
方法。这个闭包将被一个实例调用Illuminate\Testing\Fluent\AssertableJson
可用于对应用程序返回的 JSON 进行断言。这where
方法可用于针对 JSON 的特定属性进行断言,而missing
方法可用于断言 JSON 中缺少特定属性:
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
断言链末尾的方法。此方法通知 Laravel JSON 对象上可能存在其他属性。如果etc
如果不使用方法,则如果 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
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function 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'
);
测试视图
Laravel 还允许您在不向应用程序发出模拟 HTTP 请求的情况下呈现视图。为此,您可以调用view
测试中的方法。这view
方法接受视图名称和可选的数据数组。该方法返回一个实例Illuminate\Testing\TestView
,它提供了几种方法来方便地对视图的内容进行断言:
<?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 细绳。像view
方法,blade
方法返回一个实例Illuminate\Testing\TestView
:
$view = $this->blade(
'<x-component :name="$name" />',
['name' => 'Taylor']
);
$view->assertSee('Taylor');
您可以使用component
方法来评估和呈现刀片组件.这component
方法返回一个实例Illuminate\Testing\TestComponent
:
$view = $this->component(Profile::class, ['name' => 'Taylor']);
$view->assertSee('Taylor');
可用断言
响应断言
Laravel 的Illuminate\Testing\TestResponse
类提供了多种自定义断言方法,您可以在测试应用程序时使用这些方法。可以在返回的响应中访问这些断言json
,get
,post
,put
, 和delete
测试方法:
assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertDownload assertExactJson assertForbidden assertHeader assertHeaderMissing assertJson assertJsonCount assertJsonFragment assertJsonIsArray assertJsonIsObject assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonMissingPath assertJsonStructure assertJsonValidationErrors assertJsonValidationErrorFor assertLocation assertContent assertNoContent assertStreamedContent assertNotFound assertOk assertPlainCookie assertRedirect assertRedirectContains assertRedirectToRoute assertRedirectToSignedRoute assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertStatus assertSuccessful assertUnauthorized assertUnprocessable assertValid assertInvalid assertViewHas assertViewHasAll assertViewIs assertViewMissing
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, $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);
assertForbidden
断言响应具有禁止 (403) HTTP 状态代码:
$response->assertForbidden();
assertHeader
断言响应中存在给定的标头和值:
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
断言响应中不存在给定的标头:
$response->assertHeaderMissing($headerName);
assertJson
断言响应包含给定的 JSON 数据:
$response->assertJson(array $data, $strict = false);
这assertJson
方法将响应转换为数组并利用PHPUnit::assertArraySubset
验证给定数组是否存在于应用程序返回的 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 形式返回的验证错误and 没有错误被闪现到会话存储。
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');
Note
更通用的assertInvalid 方法可用于断言响应具有以 JSON 形式返回的验证错误or 错误被闪现到会话存储。
assertJsonValidationErrorFor
断言响应对给定键有任何 JSON 验证错误:
$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');
assertLocation
断言响应在Location
标头:
$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();
assertPlainCookie
断言响应包含给定的未加密 cookie:
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
断言响应是对给定 URI 的重定向:
$response->assertRedirect($uri);
assertRedirectContains
断言响应是否重定向到包含给定字符串的 URI:
$response->assertRedirectContains($string);
assertRedirectToRoute
断言响应是对给定的重定向命名路线:
$response->assertRedirectToRoute($name = null, $parameters = []);
assertRedirectToSignedRoute
断言响应是对给定的重定向签名路线:
$response->assertRedirectToSignedRoute($name = null, $parameters = []);
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);
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
:
$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 形式返回的验证错误or 错误被闪现到会话存储。
assertSessionHasErrorsIn
断言会话包含给定的错误$keys
在特定的错误包.如果$keys
是一个关联数组,断言会话在错误包中包含每个字段(键)的特定错误消息(值):
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
断言会话没有验证错误:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
断言会话没有给定键的验证错误:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
Note
更通用的assertValid 方法可用于断言响应没有以 JSON 形式返回的验证错误and 没有错误被闪现到会话存储。
assertSessionMissing
断言会话不包含给定的密钥:
$response->assertSessionMissing($key);
assertStatus
断言响应具有给定的 HTTP 状态代码:
$response->assertStatus($code);
assertSuccessful
断言响应具有成功(>= 200 且 < 300)HTTP 状态代码:
$response->assertSuccessful();
assertUnauthorized
断言响应具有未经授权的 (401) HTTP 状态代码:
$response->assertUnauthorized();
assertUnprocessable
断言响应具有不可处理的实体 (422) HTTP 状态代码:
$response->assertUnprocessable();
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';
});
此外,视图数据可以作为响应中的数组变量访问,让您可以方便地检查它:
$this->assertEquals('Taylor', $response['name']);
assertViewHasAll
断言响应视图具有给定的数据列表:
$response->assertViewHasAll(array $data);
此方法可用于断言视图仅包含与给定键匹配的数据:
$response->assertViewHasAll([
'name',
'email',
]);
或者,您可以断言视图数据存在并且具有特定值:
$response->assertViewHasAll([
'name' => 'Taylor Otwell',
'email' => 'taylor@example.com,',
]);
assertViewIs
断言给定的视图是由路由返回的:
$response->assertViewIs($value);
assertViewMissing
断言给定的数据键不可用于应用程序响应中返回的视图:
$response->assertViewMissing($key);
身份验证断言
Laravel 还提供了多种与身份验证相关的断言,您可以在应用程序的功能测试中使用这些断言。请注意,这些方法是在测试类本身而不是Illuminate\Testing\TestResponse
方法返回的实例,例如get
和post
.
assertAuthenticated
断言用户已通过身份验证:
$this->assertAuthenticated($guard = null);
assertGuest
断言用户未通过身份验证:
$this->assertGuest($guard = null);
assertAuthenticatedAs
断言特定用户已通过身份验证:
$this->assertAuthenticatedAs($user, $guard = null);
验证断言
Laravel 提供了两个主要的验证相关断言,您可以使用它们来确保您的请求中提供的数据有效或无效。
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',
]);