orchestra/testbench-browser-kit

Laravel浏览器套件测试辅助工具,用于包的开发


README

BrowserKit测试组件是一个简单的包,旨在帮助您使用laravel/browser-kit-testing为您的Laravel包编写测试。

tests Latest Stable Version Total Downloads Latest Unstable Version License

版本兼容性

安装

要通过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还提供了几种测试表单的方法。typeselectcheckattachpress方法允许您与所有表单输入交互。例如,让我们假设这个表单存在于应用程序的注册页面上

<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及其响应的助手。例如,可以使用jsongetpostputpatchdelete方法使用不同的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属性和嵌套的包含自己的nameage属性的pet对象的预期。如果响应中存在额外的键,seeJsonStructure不会失败。例如,如果petweight属性,测试仍然会通过。

您可以使用*来断言返回的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());
}

如果您正在发送POSTPUTPATCH请求,您可以将输入数据数组与请求一起传递。当然,这些数据将在您的路由和控制器中通过请求实例可用。

$response = $this->call('POST', '/user', ['name' => 'Taylor']);

PHPUnit断言

Laravel为PHPUnit测试提供了各种自定义断言方法。