orchestra / testbench-browser-kit
Laravel浏览器套件测试辅助工具,用于包的开发
Requires
- php: ^8.2
- laravel/browser-kit-testing: ^7.2
- orchestra/testbench: ^9.0
- symfony/dom-crawler: ^7.0
Requires (Dev)
- laravel/pint: ^1.6
- phpstan/phpstan: ^1.10.50
- 9.x-dev
- v9.0.0
- 8.x-dev
- v8.6.0
- v8.5.0
- v8.4.0
- v8.3.0
- v8.2.0
- v8.1.0
- v8.0.1
- v8.0.0
- 7.x-dev
- v7.15.0
- v7.14.0
- v7.13.0
- v7.12.0
- v7.11.0
- v7.10.0
- v7.9.0
- v7.8.0
- v7.7.0
- v7.6.1
- v7.6.0
- v7.5.0
- v7.4.0
- v7.3.4
- v7.3.3
- v7.3.2
- v7.3.1
- v7.3.0
- v7.2.0
- v7.1.0
- v7.0.0
- 6.x-dev
- v6.20.0
- v6.19.0
- v6.18.0
- v6.17.3
- v6.17.2
- v6.17.1
- v6.17.0
- v6.16.1
- v6.16.0
- v6.15.0
- v6.14.0
- v6.13.0
- v6.12.0
- v6.11.0
- v6.10.0
- v6.9.0
- v6.8.0
- v6.7.0
- v6.6.0
- v6.5.1
- v6.5.0
- v6.4.0
- v6.3.0
- v6.2.0
- v6.1.0
- v6.0.0
- 5.x-dev
- v5.11.0
- v5.10.0
- v5.9.0
- v5.8.0
- v5.7.0
- v5.6.0
- v5.5.0
- v5.4.0
- v5.3.0
- v5.2.0
- v5.1.0
- v5.0.2
- v5.0.1
- v5.0.0
- 4.x-dev
- v4.15.0
- v4.14.0
- v4.13.0
- v4.12.0
- v4.11.0
- v4.10.0
- v4.9.0
- v4.8.0
- v4.7.0
- v4.6.0
- v4.5.0
- v4.4.1
- v4.4.0
- v4.3.0
- v4.2.0
- v4.1.0
- v4.0.1
- v4.0.0
- 3.9.x-dev
- v3.9.3
- v3.9.2
- v3.9.1
- v3.9.0
- 3.8.x-dev
- v3.8.0
- 3.7.x-dev
- v3.7.2
- v3.7.1
- v3.7.0
- 3.6.x-dev
- v3.6.1
- v3.6.0
- 3.5.x-dev
- v3.5.5
- v3.5.4
- v3.5.3
- v3.5.2
- v3.5.1
- v3.5.0
- 3.4.x-dev
- v3.4.1
- v3.4.0
- 3.3.x-dev
- v3.3.0
- 3.2.x-dev
- v3.2.0
- 3.1.x-dev
- v3.1.0
This package is auto-updated.
Last update: 2024-08-30 15:26:42 UTC
README
BrowserKit测试组件是一个简单的包,旨在帮助您使用laravel/browser-kit-testing为您的Laravel包编写测试。
版本兼容性
安装
要通过composer安装,请在终端运行以下命令
composer require --dev "orchestra/testbench-browser-kit"
用法
Testbench浏览器套件为Laravel 5.4及以上版本添加了浏览器套件测试支持。您只需将Orchestra\Testbench\TestCase
替换为Orchestra\Testbench\BrowserKit\TestCase
即可。
<?php namespace Tests; use Orchestra\Testbench\BrowserKit\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase { public $baseUrl = 'http://localhost'; // ... }
简介
Laravel浏览器套件测试提供了一个非常流畅的API,用于向您的应用程序发送HTTP请求、检查输出以及填写表单。例如,看一下下面的测试定义
<?php use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testBasicExample() { $this->visit('/') ->see('Laravel') ->dontSee('Rails'); } }
visit
方法向应用程序发送一个GET
请求。see
方法断言我们应该在应用程序的响应中看到给定的文本。dontSee
方法断言给定的文本没有返回在应用程序的响应中。这是Laravel中最基本的测试。
您也可以使用visitRoute
方法通过命名的路由发送一个GET
请求
$this->visitRoute('profile'); $this->visitRoute('profile', ['user' => 1]);
与应用程序交互
当然,您可以做的不仅仅是断言文本出现在给定的响应中。让我们看看一些点击链接和填写表单的例子
与链接交互
在这个测试中,我们将向应用程序发送请求,"点击"返回响应中的链接,并断言用户着陆在给定的URI上。例如,假设我们的响应中有一个文本值为"关于我们"的链接
<a href="/about-us">About Us</a>
现在,让我们编写一个测试来点击链接并断言用户着陆在正确的页面上
public function testBasicExample() { $this->visit('/') ->click('About Us') ->seePageIs('/about-us'); }
您也可以使用seeRouteIs
方法检查用户是否到达了正确的命名路由
->seeRouteIs('profile', ['user' => 1]);
与表单交互
Laravel还提供了几种测试表单的方法。type
、select
、check
、attach
和press
方法允许您与所有表单输入交互。例如,让我们假设这个表单存在于应用程序的注册页面上
<form action="/register" method="POST"> {{ csrf_field() }} <div> Name: <input type="text" name="name"> </div> <div> <input type="checkbox" value="yes" name="terms"> Accept Terms </div> <div> <input type="submit" value="Register"> </div> </form>
我们可以编写一个测试来完成这个表单并检查结果
public function testNewUserRegistration() { $this->visit('/register') ->type('Taylor', 'name') ->check('terms') ->press('Register') ->seePageIs('/dashboard'); }
当然,如果您的表单包含其他输入,例如单选按钮或下拉框,您也可以轻松填写这些类型的字段。以下是每个表单操作方法的列表
文件输入
如果您的表单包含file
输入,您可以使用attach
方法将文件附加到表单上
public function testPhotoCanBeUploaded() { $this->visit('/upload') ->attach($pathToFile, 'photo') ->press('Upload') ->see('Upload Successful!'); }
测试JSON API
Laravel还提供了一些用于测试JSON API及其响应的助手。例如,可以使用json
、get
、post
、put
、patch
和delete
方法使用不同的HTTP动词发出请求。您还可以轻松将这些方法和数据、头信息一起传递。为了入门,让我们编写一个测试来向/user
发送一个POST
请求并断言返回了预期的数据
<?php class ExampleTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testBasicExample() { $this->json('POST', '/user', ['name' => 'Sally']) ->seeJson([ 'created' => true, ]); } }
{提示}
seeJson
方法将给定的数组转换为JSON,然后验证JSON片段是否出现在应用程序返回的整个JSON响应中。因此,如果JSON响应中还有其他属性,只要给定的片段存在,这个测试仍然会通过。
验证精确匹配
如果您想验证给定的数组与应用程序返回的JSON完全匹配,应使用seeJsonEquals
方法。
<?php class ExampleTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testBasicExample() { $this->json('POST', '/user', ['name' => 'Sally']) ->seeJsonEquals([ 'created' => true, ]); } }
验证结构匹配
还可以验证JSON响应是否符合特定结构。在这种情况下,您应使用seeJsonStructure
方法并传入预期的JSON结构。
<?php class ExampleTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testBasicExample() { $this->get('/user/1') ->seeJsonStructure([ 'name', 'pet' => [ 'name', 'age', ], ]); } }
上述示例说明了期望收到一个具有name
属性和嵌套的包含自己的name
和age
属性的pet
对象的预期。如果响应中存在额外的键,seeJsonStructure
不会失败。例如,如果pet
有weight
属性,测试仍然会通过。
您可以使用*
来断言返回的JSON结构具有一个列表,其中每个列表项至少包含值集中找到的属性。
<?php class ExampleTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testBasicExample() { // Assert that each user in the list has at least an id, name and email attribute. $this->get('/users') ->seeJsonStructure([ '*' => [ 'id', 'name', 'email', ], ]); } }
您还可以嵌套*
表示法。在这种情况下,我们将断言JSON响应中的每个用户都包含一组指定的属性,并且每个用户上的每个宠物也包含一组指定的属性。
$this->get('/users') ->seeJsonStructure([ '*' => [ 'id', 'name', 'email', 'pets' => [ '*' => [ 'name', 'age', ], ], ], ]);
会话/身份验证
Laravel为测试期间处理会话提供了一些助手函数。首先,您可以使用withSession
方法将会话数据设置为给定的数组。这在在向应用程序发出请求之前加载会话数据时非常有用。
<?php class ExampleTest extends TestCase { public function testApplication() { $this->withSession(['foo' => 'bar']) ->visit('/'); } }
当然,会话的一个常见用途是维护认证用户的会话状态。actingAs
助手方法提供了一个简单的方式来认证指定的用户为当前用户。例如,我们可以使用模型工厂来生成和认证用户。
<?php class ExampleTest extends TestCase { public function testApplication() { $user = factory(App\User::class)->create(); $this->actingAs($user) ->withSession(['foo' => 'bar']) ->visit('/') ->see('Hello, '.$user->name); } }
您还可以通过将守卫名称作为actingAs
方法的第二个参数传入来指定用于认证给定用户的守卫。
$this->actingAs($user, 'api')
禁用中间件
在测试应用程序时,您可能会发现禁用中间件对某些测试很有用。这将允许您在隔离中间件相关问题的同时测试路由和控制器。Laravel包含一个简单的WithoutMiddleware
特质,您可以使用它来自动禁用测试类的所有中间件。
<?php use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { use WithoutMiddleware; // }
如果您只想禁用少数测试方法的中间件,您可以在测试方法中调用withoutMiddleware
方法。
<?php class ExampleTest extends TestCase { /** * A basic functional test example. * * @return void */ public function testBasicExample() { $this->withoutMiddleware(); $this->visit('/') ->see('Laravel'); } }
自定义HTTP请求
如果您想向应用程序发送自定义HTTP请求并获取完整的Illuminate\Http\Response
对象,您可以使用call
方法。
public function testApplication() { $response = $this->call('GET', '/'); $this->assertEquals(200, $response->status()); }
如果您正在发送POST
、PUT
或PATCH
请求,您可以将输入数据数组与请求一起传递。当然,这些数据将在您的路由和控制器中通过请求实例可用。
$response = $this->call('POST', '/user', ['name' => 'Taylor']);
PHPUnit断言
Laravel为PHPUnit测试提供了各种自定义断言方法。