- HTTP 测试
- 可用断言方法
- 响应断言
- assertCookie
- assertCookieExpired
- assertCookieNotExpired
- assertCookieMissing
- assertCreated
- assertDontSee
- assertDontSeeText
- assertExactJson
- assertForbidden
- assertHeader
- assertHeaderMissing
- assertJson
- assertJsonCount
- assertJsonFragment
- assertJsonMissing
- assertJsonMissingExact
- assertJsonMissingValidationErrors
- assertJsonPath
- assertJsonStructure
- assertJsonValidationErrors
- assertLocation
- assertNoContent
- assertNotFound
- assertOk
- assertPlainCookie
- assertRedirect
- assertSee
- assertSeeInOrder
- assertSeeText
- assertSeeTextInOrder
- assertSessionHas
- assertSessionHasInput
- assertSessionHasAll
- assertSessionHasErrors
- assertSessionHasErrorsIn
- assertSessionHasNoErrors
- assertSessionDoesntHaveErrors
- assertSessionMissing
- assertStatus
- assertSuccessful
- assertUnauthorized
- assertViewHas
- assertViewHasAll
- assertViewIs
- assertViewMissing
- Authentication Assertions
- 响应断言
HTTP 测试
介绍
Laravel提供了一个非常流畅的API,用于向您的应用程序发出HTTP请求并检查输出。例如,看一下下面定义的功能测试:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* 一个基本的测试示例。
*
* @return void
*/
public function testBasicTest()
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
该get
方法GET
向应用程序发出请求,而该assertStatus
方法断言返回的响应应具有给定的HTTP状态代码。除了这个简单的断言之外,Laravel还包含用于检查响应头,内容,JSON结构等的各种断言。
自定义请求头
您可以使用此withHeaders
方法自定义请求的标头,然后再将其发送到应用程序。这使您可以将任何想要的自定义标头添加到请求中:
<?php
class ExampleTest extends TestCase
{
/**
* 一个基本的功能测试示例。
*
* @return void
*/
public function testBasicExample()
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
技巧:运行测试时,将自动禁用CSRF中间件。
验证 JSON 完全匹配
如果你想验证给定的数组 完全 匹配应用返回的 JSON 结果,你应该使用 assertExactJson
方法:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
验证 JSON 路径
如果你想验证 JSON 响应是否包含指定路径上的某些给定数据,则应使用 assertJsonPath
方法:
<?php
class ExampleTest extends TestCase
{
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
$response = $this->json('POST', '/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'foo')
}
}
测试文件上传
Illuminate\Http\UploadedFile
提供了一个 fake
方法用于生成虚拟的文件或者图像以供测试之用。 它可以和 Storage
facade 的 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 testAvatarUpload()
{
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->json('POST', '/avatar', [
'avatar' => $file,
]);
// Assert the file was stored...
Storage::disk('avatars')->assertExists($file->hashName());
// Assert a file does not exist...
Storage::disk('avatars')->assertMissing('missing.jpg');
}
}
虚拟文件制定
在使用 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 给 PHPUnit 测试提供了各种各样的常用断言方法。可从 json
, get
, post
, put
,和 delete
测试方法中访问这些断言:
assertCookie assertCookieExpired assertCookieNotExpired assertCookieMissing assertCreated assertDontSee assertDontSeeText assertExactJson assertForbidden assertHeader assertHeaderMissing assertJson assertJsonCount assertJsonFragment assertJsonMissing assertJsonMissingExact assertJsonMissingValidationErrors assertJsonPath assertJsonStructure assertJsonValidationErrors assertLocation assertNoContent assertNotFound assertOk assertPlainCookie assertRedirect assertSee assertSeeInOrder assertSeeText assertSeeTextInOrder assertSessionHas assertSessionHasInput assertSessionHasAll assertSessionHasErrors assertSessionHasErrorsIn assertSessionHasNoErrors assertSessionDoesntHaveErrors assertSessionMissing assertStatus assertSuccessful assertUnauthorized 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 状态码:
$response->assertCreated();
assertDontSee
断言响应中不包含给定的字符串:
$response->assertDontSee($value);
assertDontSeeText
断言给定字符串不包含在响应文本中:
$response->assertDontSeeText($value);
assertExactJson
断言响应中包含的数据与给定的 JSON 数据完全匹配:
$response->assertExactJson(array $data);
assertForbidden
断言响应中有禁止状态码:
$response->assertForbidden();
assertHeader
断言响应中有给定的 header 头:
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
断言响应中没有给定的 header 头:
$response->assertHeaderMissing($headerName);
assertJson
断言响应包含给定的 JSON 数据:
$response->assertJson(array $data, $strict = false);
assertJsonCount
断言响应 JSON 中有一个数组,其中包含给定键的预期元素数量:
$response->assertJsonCount($count, $key = null);
assertJsonFragment
断言响应包含给定 JSON 片段:
$response->assertJsonFragment(array $data);
assertJsonMissing
断言响应未包含给定的 JSON 片段:
$response->assertJsonMissing(array $data);
assertJsonMissingExact
断言响应不包含确切的 JSON 片段:
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
断言响应没有给定键的 JSON 验证错误:
$response->assertJsonMissingValidationErrors($keys);
assertJsonPath
断言响应包含指定路径上的给定数据:
$response->assertJsonPath($path, array $data, $strict = false);
assertJsonStructure
断言响应具有给定的 JSON 结构:
$response->assertJsonStructure(array $structure);
assertJsonValidationErrors
断言响应具有给定键的给定 JSON 验证错误:
$response->assertJsonValidationErrors(array $data);
assertLocation
断言响应在 Location
头部中具有给定的 URI 值:
$response->assertLocation($uri);
assertNoContent
断言响应具有给定的状态码,没有内容。
$response->assertNoContent($status = 204);
assertNotFound
断言响应具有未找到状态码:
$response->assertNotFound();
assertOk
断言响应有 200 状态码:
$response->assertOk();
assertPlainCookie
断言响应包含给定的 cookie (未加密):
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
断言响应会重定向到给定的 URI:
$response->assertRedirect($uri);
assertSee
断言给定的字符串包含在响应中:
$response->assertSee($value);
assertSeeInOrder
断言响应中有序包含了给定的字符串:
$response->assertSeeInOrder(array $values);
assertSeeText
断言给定的字符串包含在响应文本中:
$response->assertSeeText($value);
assertSeeTextInOrder
断言给定的字符串有序包含在响应文本中:
$response->assertSeeTextInOrder(array $values);
assertSessionHas
断言 session 中包含给定的数据:
$response->assertSessionHas($key, $value = null);
assertSessionHasInput
断言 session 中有给定值数组:
$response->assertSessionHasInput($key, $value = null);
assertSessionHasAll
断言 session 中有给定值列表:
$response->assertSessionHasAll(array $data);
assertSessionHasErrors
断言该 session 包含给定 $keys
的错误。 如果 $keys
是一个关联数组,则断言该 session 包含每个字段(键)的特定错误消息(值):
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSessionHasErrorsIn
断言该 session 在特定错误包中包含给定 $keys
的错误。 如果 $keys
是一个关联数组,则断言该会话在错误包内包含每个字段(键)的特定错误消息(值):
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
断言 session 没有错误:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
断言 session 没有给定键错误:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionMissing
断言 session 中不包含给定键:
$response->assertSessionMissing($key);
assertStatus
断言响应中具有给定的状态码:
$response->assertStatus($code);
assertSuccessful
断言响应中有成功 (>= 200 and < 300) 的状态码:
$response->assertSuccessful();
assertUnauthorized
断言响应中有未授权的(401)状态码:
$response->assertUnauthorized();
assertViewHas
断言响应视图是一段给定的数据:
$response->assertViewHas($key, $value = null);
另外,视图数据可以作为数组变量访问:
$this->assertEquals('Taylor', $response['name']);
assertViewHasAll
断言响应视图具有给定的数据列表:
$response->assertViewHasAll(array $data);
assertViewIs
断言路由返回给定的视图:
$response->assertViewIs($value);
assertViewMissing
断言响应视图缺少一段绑定数据:
$response->assertViewMissing($key);
Authentication Assertions
Laravel 还为你的 PHPUnit 测试提供了各种与身份验证相关的断言:
Method | Description |
---|---|
$this->assertAuthenticated($guard = null); | 断言此用户已被认证。 |
$this->assertGuest($guard = null); | 断言此用户未被认证。 |
$this->assertAuthenticatedAs($user, $guard = null); | 断言给定的用户被认证。 |
$this->assertCredentials(array $credentials, $guard = null); | 断言给定的凭证有效。 |
$this->assertInvalidCredentials(array $credentials, $guard = null); | 断言给定的凭证无效。 |
本文章首发在 LearnKu.com 网站上。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接 我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
Laravel China 社区:https://learnku.com/docs/laravel/7.x/http-tests/7506