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 方法被调用。

断言属性存在/不存在

要断言某个属性存在或不存在,您可以使用hasmissing 方法:

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

除此之外hasAllmissingAll 方法允许同时断言多个属性的存在或不存在:

$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 类提供了whereTypewhereAllType 这样做的方法:

$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'])
);

whereTypewhereAllType 方法识别以下类型: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

断言响应包含给定的 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);

例如,如果您的应用程序的会话包含namestatus 键,您可以断言两者都存在并具有指定的值,如下所示:

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

assertSessionHasErrors

断言会话包含给定的错误$keys.如果$keys 是一个关联数组,断言会话包含每个字段(键)的特定错误消息(值)。当测试将验证错误闪烁到会话而不是将它们作为 JSON 结构返回的路由时,应该使用此方法:

$response->assertSessionHasErrors(
    array $keys, $format = null, $errorBag = 'default'
);

例如,断言nameemail 字段具有闪烁到会话的验证错误消息,您可以调用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 方法返回的实例,例如getpost.

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',
]);
豫ICP备18041297号-2