[ Laravel 5.3 文档 ] 测试 —— 应用测试

   2016-10-13 0
核心提示:1、简介Laravel 为生成 HTTP请求、测试输出、以及填充表单提供了流式API。举个例子,我们看下tests目录下包含的ExampleTest.php文件:?phpuse Illuminate\Foundation\Testing\WithoutMiddleware;use Illuminate\Foundation\Testing\DatabaseTransactions;clas

1、简介

Laravel 为生成 HTTP 请求、测试输出、以及填充表单提供了流式API。举个例子,我们看下  tests 目录下包含的 ExampleTest.php 文件

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase{
    /**
     * 基本功能测试示例
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->visit('/')
             ->see('Laravel 5')
             ->dontSee('Rails');
    }
}

visit 方法生成了一个GET请求, see 方法对我们从应用返回响应中应该看到的给定文本进行断言。 dontSee 方法对给定文本没有从应用响应中返回进行断言。在Laravel中这是最基本的有效性测试。

你还可以使用 visitRoute 方法通过命名路由生成GET请求:

$this->visitRoute('profile');
$this->visitRoute('profile', ['user' => 1]);

2、与应用交互

当然,除了对响应文本进行断言之外还有做更多测试,让我们看一些点击链接和填充表单的例子:

点击链接

在本测试中,我们将为应用生成请求,在返回的响应中“点击”链接,然后对访问URI进行断言。例如,假定响应中有一个“关于我们”的链接:

<a href=http://www.tuicool.com/articles/"/about-us">About Us

现在,让我们编写一个测试点击链接并断言用户访问页面是否正确:

public function testBasicExample(){
    $this->visit('/')
         ->click('About Us')
         ->seePageIs('/about-us');
}

还可以使用 seeRouteIs 方法检查用户是否到达正确的命名路由:

->seeRouteIs('profile', ['user' => 1]);

处理表单

Laravel 还为处理表单提供了多个方法。 type 、  selectcheckattachpress 方法允许你与所有表单输入进行交互。例如,我们假设这个表单存在于应用注册页面:

<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');
}

当然,如果你的表单包含其他输入比如单选按钮或下拉列表,也可以轻松填写这些类型的字段。这里是所有表单操作方法列表:

方法 描述
$this->type($text, $elementName) “Type” 文本到给定字段
$this->select($value, $elementName) “Select” 单选框或下拉列表
$this->check($elementName) “Check” 复选框
$this->attach($pathToFile, $elementName) “Attach” 文件到表单
$this->press($buttonTextOrElementName) “Press”  给定文本或name的按钮
$this->uncheck($elementName) “Uncheck”复选框

文件上传

如果表单包含 file 输入类型,可以使用 attach 方法添加文件到表单:

public function testPhotoCanBeUploaded(){
    $this->visit('/upload')
         ->attach($pathToFile, 'photo')
         ->press('Upload')
         ->see('Upload Successful!');
}

3、测试JSON API

Laravel 还提供多个帮助函数用于测试 JSON API 及其响应。例如, jsongetpostputpatch 和  delete 方法用于通过多种 HTTP 请求方式发出请求。你还可以轻松传递数据和请求头到这些方法。作为开始,我们编写测试来生成 POST 请求到  /user 并断言返回的数据是否是我们所期望的:

<?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值匹配

如果你想要验证给定数组和应用返回的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 方法来实现这一功能:

<?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 和嵌套  pet 对象(该对象包含  name 和  age 属性)的 JSON 数据。如果 JSON 响应中包含其它额外键  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响应中的每个用户都包含一个给定属性集合,而且每个用户的每个 pet 都包含给定属性集合:

$this->get('/users')
     ->seeJsonStructure([
         '*' => [
             'id', 'name', 'email', `pets` => [
                 '*' => [
                     'name', 'age'
                 ]
             ]
         ]
     ]);

4、Session/认证

Laravel提供了多个辅助函数用于在测试期间处理Session,首先,可以使用 withSession 方法设置 session 值到给定数组。这在测试请求前获取 session 数据时很有用:

<?php

class ExampleTest extends TestCase{
    public function testApplication()
    {
        $this->withSession(['foo' => 'bar'])
             ->visit('/');
    }
}

当然,session的最常见的作用就是维护认证用户的状态。辅助函数 actingAs 为认证给定用户是当前用户提供了简单的实现方法,例如,我们使用模型工厂生成和认证用户:

$this->actingAs($user)
             ->withSession(['foo' => 'bar'])
             ->visit('/')
             ->see('Hello, '.$user->name);
    }
}

还可以通过传递 guard 名称作为  actingAs 函数的第二个参数的方式来指定使用哪个  guard 来认证给定用户:

$this->actingAs($user, 'backend')

5、禁止中间件

测试应用时,为某些测试禁止中间件很方便。这种机制允许你将路由和控制器与中间件孤立开来做测试,Laravel包含了一个简单的  WithoutMiddleware trait,可以使用该 trait 自动在测试类中禁止所有中间件:

use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase{
    use WithoutMiddleware;
    //
}

如果你只想在某些方法中禁止中间件,可以在测试方法中调用 withoutMiddleware 方法:

<?php

class ExampleTest extends TestCase{
    /**
     * 基本功能测试示例
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->withoutMiddleware();

        $this->visit('/')
             ->see('Laravel 5');
    }
}

6、自定义HTTP请求

如果你想要在应用中生成自定义HTTP请求并获取完整的 Illuminate\Http\Response 对象,可以使用  call 方法:

public function testApplication(){
    $response = $this->call('GET', '/');
    $this->assertEquals(200, $response->status());
}

如果你要生成 POSTPUT 或者  PATCH 请求可以在请求中传入输入数据数组,在路由或控制器中可以通过Request实例访问请求数据:

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

7、PHPUnit断言方法

Laravel 为 PHPUnit 测试提供了额外的断言方法:

方法 描述
->assertResponseOk(); 断言客户端响应状态码是否为200
->assertResponseStatus($code); 断言客户端响应状态码是否是给定$code
->assertViewHas($key, $value = null); 断言响应视图是否包含给定的绑定数据片段
->assertViewHasAll(array $bindings); 断言视图是否包含给定绑定数据列表
->assertViewMissing($key); 断言响应视图缺失绑定数据片段
->assertRedirectedTo($uri, $with = []); 断言客户端是否重定向到给定URI
->assertRedirectedToRoute($name, $parameters = [], $with = []); 断言客户端是否重定向到给定路由
->assertRedirectedToAction($name, $parameters = [], $with = []); 断言客户端是否重定向到给定action
->assertSessionHas($key, $value = null); 断言session是否包含给定值
->assertSessionHasAll(array $bindings); 断言session是否保护眼给定值列表
->assertSessionHasErrors($bindings = [], $format = null); 断言session是否包含错误绑定
->assertHasOldInput(); 断言sessio包含上次输入数据
->assertSessionMissing($key); 断言session缺失给定key
 
标签: Laravel 应用测试
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • nginx 各类网站设置 (laravel , thinkphp , nod
    基础部分设置[root@centos ~]# vim /opt/nginx/conf/nginx.confuser www www;worker_processes auto;pid logs/nginx.pid;worker_rlimit_nofile 100000;events {use epoll;multi_accept on;worker_connections 65535 ;}http {include mime.types;default_type
    02-09
  • PHP trait 特性在 Laravel 中的使用个人心得
    trait 是在PHP5.4中为了方便代码复用的一种实现方式,但目前我在看的的PHP项目中较少看的有程序员去主动使用这个实现方式,在laravel中有很多 trait 的使用,关于trait 在 laravel 的使用请参看 Laravel 在哪些地方用了 trait?我曾在 Laravel 中大型项目面向
    02-09
  • 让我们用 laravel-mix 为 TypeScript 和 Sass
    介绍前端编译TypeScript、Sass、模板引擎等时经常用到Gulp和webpack。这是我个人的印象,但它们似乎都难以管理,因为它们的描述往往复杂而冗长。我不想积极进行,因为我要担心加载器的顺序并且有很多配置选项,我必须花时间去了解它们。我想推荐那里laravel
  • PHP Laravel软删除的实现方法介绍
    用Laravel 自带的 Eloquent ORM 来实现软删除。首先在数据迁移文件中添加删除时间字段./database/migrations/2014_10_12_000000_create_users_table.php?phpuse Illuminate\Database\Migrations\Migration;use Illuminate\Database\Schema\Blueprint;use Illu
  • Laravel中如何使用PHP的装饰器模式 php laravel
    本文小编为大家详细介绍“Laravel中如何使用PHP的装饰器模式”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel中如何使用PHP的装饰器模式”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。装饰器模式定义:它可以帮助您在
    02-08 laravelphp
  • PHP laravel使用自定义邮件类实现发送邮件
    PHP laravel使用自定义邮件类实现发送邮件
    当登录邮箱为腾讯企业邮箱的时候。Phpmailer发送邮件就不好用了,具体哪里不好用,我没真没找到。但是,邮件得发啊,怎么办呢?我这里搞了一个自定义的发送邮件类,腾讯企业邮箱也可用。但是,邮件发送失败,不会返回报错信息,这个可能是有点坑。源码如下:?
  • 详解PHP laravel中的加密与解密函数
    目录一:简介二:配置三:使用加密/解密1:加密2:不使用序列化进行加密3:解密Laravel为我们提供了完整的加密方法及加密模式。我之前一般在加密的时候使用的是我自己写的加密函数,但是这个玩意,有的位置还是不太使用,当然,破解的话,基本上也是不可能的
  • PHP laravel缓存cache机制详解
    目录一、访问多个缓存存储二、从缓存中获取数据1.获取数据并设置默认值2.检查缓存项是否存在3.数值增加/减少4.获取存储5.获取删除三、缓存中存储数据1.获取存储数据2.缓存不存在时存储数据3.永久存储数据四、从缓存中移除数据Laravel中的cache为我们提供了三
  • PHP laravel实现导出PDF功能
    PHP laravel实现导出PDF功能
    目录一、laravel-tcpdf二、tcpdf三、TCPDF解决保存中文文件名的方法补充一、laravel-tcpdf导出PDF文件Laravel框架为我们集成了一个插件tcpdf。下载地址:https://github.com/elibyy/tcpdf-laravel然后使用composer进行安装就可以了。具体安装过程,请查看文末
  • PHP laravel缓存cache机制怎么实现
    今天小编给大家分享一下PHP laravel缓存cache机制怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Laravel中的cache为我们
点击排行