欢迎光临
我们一直在努力

laravel 单元测试的一些属性和方法

phpunit文档地址:

https://phpunit.de/manual/current/zh_cn/appendixes.assertions.html

1、简介

Laravel 植根于测试,实际上,基于 PHPUnit 对测试提供支持是开箱即用的,并且 phpunit.xml 文件已经为应用做好了所需配置。框架还提供了方便的辅助方法允许你对应用进行优雅的测试。

默认情况下,tests 目录包含了两个子目录:FeatureUnit,分别用于功能测试和单元测试,单元测试专注于小的、相互隔离的代码,实际上,大部分单元测试可能都是聚焦于单个方法。功能测试可用于测试较大区块的代码,包括若干组件之前的交互,甚至一个完整的 HTTP 请求。

FeatureUnit 测试目录下默认都提供了 ExampleTest.php 文件,安装完新的 Laravel 应用后,只需简单在命令行运行 phpunit 即可运行测试。

2、环境

运行测试的时候,Laravel 会自动设置环境变量为 testing,这是因为 phpunit.xml 中已经配备了相应设置。Laravel 在测试时还会自动配置 SessionCache 驱动为 array,这意味着测试时不会持久化存储 SessionCache

如果需要的话,你也可以定义其它测试环境配置值。testing 环境变量可以在 phpunit.xml 文件中配置,但是需要在运行测试之前使用 Artisan 命令 config:clear 清除配置缓存。

3、创建&运行测试

在你的项目根目录,使用 Artisan 命令 make:test

php artisan make:test UserTest // 在Feature目录下创建测试类(功能测试)

php artisan make:test UserTest --unit // 在Unit目录下创建测试类(单元测试)

如下:

<?php

namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class UserTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->assertTrue(true);
    }
}

创建完测试类后,就可以像使用 PHPUnit 一样定义测试方法,要运行测试,只需在终端执行 phpunit 命令即可:

注意:如果运行时出现 -bash: phpunit: command not found

命令改成:

vendor/bin/phpunit

运行单个测试示例:

vendor/bin/phpunit --filter=UserTest

Laravel 为生成 HTTP 请求、测试输出提供了流式 API。举个例子,我们看下下面定义的测试:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    /**
     * 基本测试示例.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

get 方法生成了一个 GET 请求,而 assertStatus 方法断言返回的响应应该包含给定的 HTTP 状态码。除了这个简单的断言之外,Laravel 还包含检查响应头、响应内容、响应 JSON 结构等多种断言。

会话/认证

Laravel 提供了多个辅助函数用于在 HTTP 测试期间处理会话(Session),首先,你可以使用 withSession 方法来设置会话数据。这对于在发起请求之前加载会话数据很有用:

<?php

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

当然,会话最常见的用途还是维护认证用户的状态。对此,辅助函数 actionAs 方法提供了一个简单的方式来认证当前用户,例如,我们可以使用模型工厂来生成并认证用户:

<?php

use App\User;

class ExampleTest extends TestCase
{
    public function testApplication()
    {
        $user = factory(User::class)->create();

        $response = $this->actingAs($user)
                         ->withSession(['foo' => 'bar'])
                         ->get('/');
    }
}

你还可以通过传递 guard 名作为 actionAs 方法的第二个参数来指定使用哪一个 guard 来认证给定用户:

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

4、测试 JSON API

Laravel 还提供了多个辅助函数用于测试 JSON API 及其响应。例如, json、get、post、put、patch 和 delete 方法用于通过多种 HTTP 请求方式发出请求。

你还可以轻松传递数据和请求头到这些方法。作为开始,我们编写测试来生成 POST 请求到 /user 并断言返回的数据是否是我们所期望的:

<?php

class ExampleTest extends TestCase
{
    /**
     * 基本功能测试示例.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->json('POST', '/user', ['name' => 'Sally']);

        $response
            ->assertStatus(200)
            ->assertJson([
                'created' => true,
            ]);
    }
}

注:assertJson 方法将响应转化为数组并使用 PHPUnit::assertArraySubset 验证给定数组在应用返回的 JSON 响应中存在。所以,如果在 JSON 响应中存在其它属性,这个测试仍然会通过,只要给定的片段存在即可。

精确验证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(200)
            ->assertExactJson([
                'created' => true,
            ]);
    }
}

测试文件上传

Illuminate\Http\UploadedFile 类提供了一个 fake 方法用于生成假文件或图片进行测试。这一机制和 Storage 门面的 fake 方法联合在一起,极大的简化了文件上传的测试。例如,你可以联合这两个特性来轻松测试头像上传表单:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testAvatarUpload()
    {
        Storage::fake('avatars');

        $response = $this->json('POST', '/avatar', [
            'avatar' => UploadedFile::fake()->image('avatar.jpg')
        ]);

        // 断言该文件被存储...
        Storage::disk('avatars')->assertExists('avatar.jpg');

        // 断言一个文件不存在...
        Storage::disk('avatars')->assertMissing('missing.jpg');
    }
}


伪造文件自定义

使用 fake 方法创建文件的时候,你可以指定宽度、高度、以及图片的尺寸以便更好的测试验证规则:

UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);

除了创建图片之外,你还可以使用 create 方法创建其它类型的文件:

UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);

自定义HTTP请求

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

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

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

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

有效的断言方法:

Laravel 为 PHPUnit 测试提供了多个自定义的断言方法。这些断言可以通过测试方法json、get、post、put 和 delete 返回的响应进行访问:

$response->assertStatus($code); //断言响应是否包含给定code
$response->assertRedirect($uri); //断言响应是否重定向到给定URI
$response->assertHeader($headerName, $value = null); //断言请求头是否在响应中存在
$response->assertCookie($cookieName, $value = null); //断言响应是否包含给定cookie
$response->assertPlainCookie($cookieName, $value = null); //断言响应是否包含给定cookie(未加密)
$response->assertSessionHas($key, $value = null); //断言会话是否包含给定数据片段
$response->assertSessionHasErrors(array $keys); //断言会话是否包含给定片段错误
$response->assertSessionMissing($key); //断言会话不包含给定键
$response->assertJson(array $data); //断言响应包含给定JSON数据
$response->assertJsonFragment(array $data); //断言响应包含给定JSON片段
$response->assertJsonMissing(array $data); //断言响应不包含给定JSON片段
$response->assertExactJson(array $data); //断言响应包含完整的给定JSON片段
$response->assertJsonStructure(array $structure); //断言响应包含给定JSON结构
$response->assertViewHas($key, $value = null); //断言响应视图包含给定数据片段

5、测试——数据库

1、简介
Laravel 提供了多个有用的工具让测试数据库驱动的应用变得更加简单。首先,你可以使用辅助函数 assertDatabaseHas 来断言数据库中的数据是否和给定数据集合匹配。例如,如果你想要通过 email 值为 sally@example.com 的条件去数据表 users 查询是否存在该记录 ,我们可以这样做:

public function testDatabase()
{
    // Make call to application...

    $this->assertDatabaseHas('users', [
        'email' => 'sally@example.com'
    ]);
}

当然,assertDatabaseHas 方法和其它类似辅助方法都是为了方便起见进行的封装,你也可以使用其它 PHPUnit 内置的断言方法来进行测试。

2、每次测试后重置数据库
每次测试后重置数据库通常很有用,这样的话上次测试的数据不会影响下一次测试。

使用迁移
一种重置数据库状态的方式是每次测试后回滚数据库并在下次测试前重新迁移。Laravel 提供了一个简单的 DatabaseMigrations trait 来自动为你处理。在测试类上简单使用该 trait 如下:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    use DatabaseMigrations;

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->get('/');

        // ...
    }
}

使用事务
另一种重置数据库状态的方式是将每一个测试用例封装到一个数据库事务中,Laravel 提供了方便的 DatabaseTransactions trait 自动为你处理:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    use DatabaseTransactions;

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->get('/');

        // ...
    }
}

注:该 trait 只在事务中封装默认数据库连接。如果你的应用使用了多个数据库连接,需要在测试类上定义一个 $connectionsToTransact 属性。该属性应该是用于执行事务的连接名数组。

6、编写工厂

测试时,通常需要在执行测试前插入新数据到数据库。在创建测试数据时,Laravel 允许你使用 模型工厂 为每个 Eloquent 模型 定义默认的属性值集合,而不用手动为每一列指定值。

作为开始,我们看一下 database/factories/ModelFactory.php 文件,该文件包含了一个工厂定义:

$faker 能生成的字段类型及实例:https://github.com/fzaninotto/Faker

$factory->define(App\User::class, function (Faker\Generator $faker) {
    static $password;

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

在闭包中,作为工厂定义,我们返回该模型上所有属性默认测试值。该闭包接收 PHP 库 Faker 实例,从而允许你方便地为测试生成多种类型的随机数据。

当然,你可以添加更多工厂到 ModelFactory.php 文件。你还可以为每个模型创建额外的工厂文件以便更好地组织管理,例如,你可以在 database/factories 目录下创建 UserFactory.php 和 CommentFactory.php 文件。 factories目录下的所有文件都会被Laravel 自动加载。

工厂状态
状态允许你在任意组合中定义可用于模型工厂的离散修改,例如, User 模型可能有一个 delinquent 状态用于修改某个默认属性值,你可以使用 state 方法来定义状态转化:

$factory->state(App\User::class, 'delinquent', function ($faker) {
    return [
        'account_status' => 'delinquent',
    ];
});

7、使用工厂

创建模型

定义好工厂后,可以在测试或数据库填充文件中通过全局的 factory 方法使用它们来生成模型实例,所以,让我们看一些创建模型的例子,首先,我们使用 make 方法,该方法创建模型但不将其保存到数据库:

public function testDatabase(){
    $user = factory(App\User::class)->make();
    // 用户模型测试...
}

还可以创建多个模型集合或者创建给定类型的模型:

// 创建3个 App\User 实例…
$users = factory(App\User::class, 3)->make();


应用状态

还可以应用任意状态到模型,如果你想要应用多个状态转化到模型,需要指定每个你想要应用的状态名:

$users = factory(App\User::class, 5)->states('deliquent')->make();
$users = factory(App\User::class, 5)->states('premium', 'deliquent')->make();

覆盖属性

如果你想要覆盖模型中的某些默认值,可以传递数组值到 make 方法,只有指定值才会被替换,剩下值保持工厂指定的默认值不变:

$user = factory(App\User::class)->make([
    'name' => 'Abigail',
]);

持久化模型

create 方法不仅能创建模型实例,还可以使用 Eloquent 的 save 方法将它们保存到数据库:

public function testDatabase()
{
    // 创建单个 App\User 实例...
    $user = factory(App\User::class)->create();

    // 创建3个 App\User 实例...
    $users = factory(App\User::class, 3)->create();

    // 在测试中使用模型...
}

你可以通过传递数组到 create 方法覆盖模型上的属性:

$user = factory(App\User::class)->create([
    'name' => 'Abigail',
]);

关联关系

在本例中,我们添加一个关联到创建的模型,使用 create 方法创建多个模型的时候,会返回一个 Eloquent 集合实例,从而允许你使用集合提供的所有方法,例如 each:

$users = factory(App\User::class, 3)
           ->create()
           ->each(function($u) {
                $u->posts()->save(factory(App\Post::class)->make());
            });

关联关系 & 属性闭包

还可以使用工厂中的闭包属性添加关联关系到模型,例如,如果你想要在创建 Post 的时候创建一个新的 User 实例,可以这么做:

$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => function () {
            return factory(App\User::class)->create()->id;
        }
    ];
});

这些闭包还接收包含它们的工厂属性数组:

$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => function () {
            return factory(App\User::class)->create()->id;
        },
        'user_type' => function (array $post) {
            return App\User::find($post['user_id'])->type;
        }
    ];
});

8、测试——模拟

1、简介

测试 Laravel 应用的时候,你可能还想要“ 模拟 ”应用的特定状态,以便在测试中不让它们真的执行。

例如,测试触发事件的控制器时,你可能想要模拟事件监听器以便它们不在测试期间真的执行。这样的话你就可以只测试控制器的 HTTP 响应,而不必担心事件监听器的执行,因为事件监听器可以在它们自己的测试用例中被测试。

Laravel 开箱为模拟事件、任务以及工厂提供了辅助函数,这些辅助函数主要是在 Mockery 之上提供了一个方便的层这样你就不必手动调用复杂的 Mockery 方法。当然,你也可以使用 Mockery 或 PHPUnit 来创建自己的模拟。

2、伪造Bus

作为模拟的替代方案,你可以使用Bus门面的 fake方法来阻止任务被分发,使用 fake的时候,测试代码执行后会进行断言:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Jobs\ShipOrder;
use Illuminate\Support\Facades\Bus;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Bus::fake();

        // 执行订单装运...
        Bus::assertDispatched(ShipOrder::class, function ($job) use ($order) {
            return $job->order->id === $order->id;
        });

        // 断言一份工作没有被分派...
        Bus::assertNotDispatched(AnotherJob::class);
    }
}

3、伪造事件

作为模拟的替代方案,你可以使用Event门面的fake方法来阻止事件监听器被执行,然后断言事件被分发,甚至检查接收的数据。当使用fake时,测试代码执行后会进行断言:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Events\OrderShipped;
use App\Events\OrderFailedToShip;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    /**
     * Test order shipping.
     */
    public function testOrderShipping()
    {
        Event::fake();

        // Perform order shipping...

        Event::assertDispatched(OrderShipped::class, function ($e) use ($order) {
            return $e->order->id === $order->id;
        });

        Event::assertNotDispatched(OrderFailedToShip::class);
    }
}

4、伪造邮件

你可以使用Mail门面的fake方法阻止邮件发送,然后断言可邮寄对象被发送给用户,甚至检查接收的数据。使用fake的时候,断言会在测试代码执行后进行:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Mail\OrderShipped;
use Illuminate\Support\Facades\Mail;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Mail::fake();

        // 执行订单装运...

        Mail::assertSent(OrderShipped::class, function ($mail) use ($order) {
            return $mail->order->id === $order->id;
        });

        // 断言一条消息被发送给给定的用户...
        Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
            return $mail->hasTo($user->email) &&
                   $mail->hasCc('...') &&
                   $mail->hasBcc('...');
        });

        // 断言没有发送邮件...
        Mail::assertNotSent(AnotherMailable::class);
    }
}

5、伪造通知

你可以使用 Notification 门面的 fake 方法来阻止通知被发送,之后断言通知是否被发送给用户,甚至可以检查接收的数据。使用 fake 的时候,断言会在测试代码执行后进行:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Notification::fake();

        // 执行订单装运...

        Notification::assertSentTo(
            $user,
            OrderShipped::class,
            function ($notification, $channels) use ($order) {
                return $notification->order->id === $order->id;
            }
        );

        // 断言发送给给定用户的通知...
        Notification::assertSentTo(
            [$user], OrderShipped::class
        );

        // 断言没有发送通知...
        Notification::assertNotSentTo(
            [$user], AnotherNotification::class
        );
    }
}

6、伪造队列

作为模拟的替代方案,你可以使用Queue门面的fake方法来阻止任务被推动到队列,然后断言任务是否被推送到队列,甚至检查接收的数据。使用fake的时候,断言会在测试代码执行后进行:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Jobs\ShipOrder;
use Illuminate\Support\Facades\Queue;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Queue::fake();

        // 执行订单装运...

        Queue::assertPushed(ShipOrder::class, function ($job) use ($order) {
            return $job->order->id === $order->id;
        });

        // 断言一个Job被推到一个给定的队列中...
        Queue::assertPushedOn('queue-name', ShipOrder::class);

        // 断言一个job没有被推进队列中...
        Queue::assertNotPushed(AnotherJob::class);
    }
}

7、伪造存储

Storage门面的fake方法允许你轻松构造伪造硬盘,以及使用UploadedFile类生成的文件,从而极大简化了文件上传测试,例如:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    public function testAvatarUpload()
    {
        Storage::fake('avatars');

        $response = $this->json('POST', '/avatar', [
            'avatar' => UploadedFile::fake()->image('avatar.jpg')
        ]);

        // 断言该文件被存储...
        Storage::disk('avatars')->assertExists('avatar.jpg');

        // 断言一个文件不存在...
        Storage::disk('avatars')->assertMissing('missing.jpg');
    }
}

8、门面

不同于传统的静态方法调用,门面可以被模拟。这与传统静态方法相比是一个巨大的优势,并且你可以对依赖注入进行测试。测试的时候,你可能经常想要在控制器中模拟 Laravel 门面的调用,例如,看看下面的控制器动作:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Cache;

class UserController extends Controller
{
    /**
     * 显示应用用户列表
     *
     * @return Response
     */
    public function index()
    {
        $value = Cache::get('key');

        //
    }
}

我们可以通过使用 shouldReceive 方法模拟 Cache 门面的调用,该方法返回一个Mockery模拟的实例,由于门面通过 Laravel 服务容器进行解析和管理,所以它们比通常的静态类更具有可测试性。例如,我们可以来模拟 Cache 门面 get 方法的调用:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Support\Facades\Cache;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class UserControllerTest extends TestCase
{
    public function testGetIndex()
    {
        Cache::shouldReceive('get')
                    ->once()
                    ->with('key')
                    ->andReturn('value');

        $response = $this->get('/users');

        // ...
    }
}


注:不要模拟 Request 门面,取而代之地,可以在测试时传递期望输入到 HTTP 辅助函数如 get 和 post,类似地,不要模拟 Config 门面,在测试中调用 Config::set 方法即可。

9、其他

下面介绍一些 laravel5 Crawler(网络爬虫) 测试中常用的属性和方法

$this->response //web应用返回的最后一个响应
$this->currentUri //当前访问的URL
visit($uri) //通过GET请求访问给定URI
get($uri, array $headers = []) //通过GET请求获取给定URI页面的内容,可以传递请求头信息(可选)
post($uri, array $data = [], array $headers = []) //提交POST请求到给定URI
put($uri, array $data = [], array $headers = []) //提交PUT请求到给定URI
patch($uri, array $data = [], array $headers = []) //提交PATCH请求到给定URI
delete($uri, array $data = [], array $headers = []) //提交DELETE请求到给定URI
followRedirects() //根据最后响应进行任意重定向
see($text, $negate = false) //断言给定文本在页面中是否出现
seeJson(array $data = null) //断言响应中是否包含JSON,如果传递了$data,还要断言包含的JSON是否与给定的匹配
seeStatusCode($status) //断言响应是否包含期望的状态码
seePageIs($uri) //断言当前页面是否与给定URI匹配
seeOnPage($uri)和landOn($uri) //seePageIs()的别名
click($name) //使用给定body、name或者id点击链接
type($text, $element) //使用给定文本填充输入框
check($element) //检查页面上的checkbox复选框
select($option, $element) //选择页面上下拉列表的某个选项
attach($absolutePath, $element) //上传文件到表单
press($buttonText) //通过使用给定文本的按钮提交表单
withoutMiddleware() //在测试中不使用中间件
dump() //输出最后一个响应返回的内容

提供给 PHPUnit 使用的应用方法和属性:

$app //Laravel 5 应用实例
$code //Artisan命令返回的最后一个码值
refreshApplication() //刷新应用。该操作由TestCase的setup()方法自动调用
call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) //调用给定URI并返回响应
callSecure($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) //调用给定HTTPS URI并返回响应
action($method, $action, $wildcards = [], $parameters = [], $cookies = [], $files = [], $server = [], $content = null) //调用控制器动作并返回响应
route($method, $name, $routeParameters = [], $parameters = [], $cookies = [], $files = [], $server = [], $content = null) //调用命名路由并返回响应
instance($abstract, $object) //在容器中注册对象实例
expectsEvents($events) //指定被给定操作触发的事件列表
withoutEvents() //无需触发事件模拟事件调度
expectsJobs($jobs) //为特定操作执行被调度的任务列表
withSession(array $data) //设置session到给定数组
flushSession() //清空当前session中的内容
startSession() //开启应用Session
actingAs($user) //为应用设置当前登录用户
be($user) //为应用设置当前登录用户
seeInDatabase($table, array $data, $connection = null) //断言给定where条件在数据库中存在
notSeeInDatabase($table, $array $data, $connection = null) //断言给定where条件在数据库中不存在
missingFromDatabase($table, array $data, $connection = null) //notSeeInDatabase()的别名
seed() //填充数据库
artisan($command, $parameters = []) //执行Artisan命令并返回码值

laravel5 提供了很多额外的断言用于帮助编写 web 应用的测试用例:

assertPageLoaded($uri, $message = null) //断言最后被加载的页面;如果加载失败抛出异常:$uri/$message
assertResponseOk() //断言客户端返回的响应状态码是否是200
assertReponseStatus($code) //断言客户端返回的响应状态码是否和给定码值相匹配
assertViewHas($key, $value = null) //断言响应视图包含给定数据片段
assertViewHasAll($bindings) //断言视图包含给定数据列表
assertViewMissing($key) //断言响应视图不包含给定数据片段
assertRedirectedTo($uri, $with = []) //断言客户端是否重定向到给定URI
assertRedirectedToRoute($name, $parameters = [], $with = []) //断言客户端是否重定向到给定路由
assertRedirectedToAction($name, $parameters = [], $with = []) //断言客户端是否重定向到给定动作
assertSessionHas($key, $value = null) //断言session包含给定键/值
assertSessionHasAll($bindings) //断言session包含给定值列表
assertSessionHasErrors($bindings = []) //断言session包含绑定错误
assertHasOldInput() //断言session中包含上一次输入
赞(0)
版权归原作者所有,如有侵权请告知。达维营-前端网 » laravel 单元测试的一些属性和方法

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址