[新手开发记录] 验证数据的测试

我准备开发一个名校公开课的汉化资料下载和讨论版,功能就是站长发布信息和资料下载链接,用户可以在下面讨论,并且可以生成各种平台的分享方式分享出去。这一系列文章就记录这一过程。当然博文功能也是必不可少的。

新建一个测试

我们已经测试了数据完备的情况下,可以新建一个 course。
但是数据如果不完备,我们应该要能够验证并报错,所以我们新建一个测试,如下:

/** @test */
    public function a_course_reauires_a_title()
    {
        $this->post('/courses', [])->assertSessionHasErrors('title');
    }

解释起来就是,注意看第二个参数是 [],一个空数组,也就是说没有 title 可以看到,所以我们就期待看到一个关于 title 的异常,也就是这段代码的含义 assertSessionHasErrors('title')
那么这时候自然会报错,因为我们并没有对 title 进行数据验证,所以我们进入 CoursesControllerstore() 方法,将验证写出来,顺便把 description 也写了,description 的测试逻辑是一样的,所以下面我只记录一下 title 的验证过程:

request()->validate(['title' => 'required', 'description' =>'required']);

这时候测试就通过了。

如果对于数据验证有些不熟悉,参考这个视频回顾一下:
【中文语音】(25)表单验证基础 - Laracasts - Laravel 6 From Scratch

数据工厂

虽然上面的测试是可以通过测试的,但是存在一个问题,因为我传入了空数组,所以数据字段多的话可能会由于其他字段的错误而引发不可预测的异常,从而影响这个单独对 title 的测试,所以最理想的状态是传入所有其他字段正确的信息,仅仅将 title 赋值为空字符串,那么就可以保证测试仅仅是针对 title 的了。
我们怎么做呢?
我们通过 Factory 来生成数据,参考:【中文语音】(30)理解外键和数据库工厂 - Laracasts - Laravel 6 From Scratch
我们新建一个 CourseFactory,所使用的模型是 Course

php artisan make:factory CourseFactory --model="Course"

文件生成如下:

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Course;
use Faker\Generator as Faker;

$factory->define(Course::class, function (Faker $faker) {
    return [
        'title' => $faker->sentence,
        'description' => $faker->paragraph
    ];
});

其中的 'title' => $faker->sentence,'description' => $faker->paragraph 就是我们自己写进去的数据生成方式。
接下来我们就可以通过 factory() 帮助函数来生成我们要的数据了,有几个不同的方法:

$attributes = factory('App\Course')->make();//返回一个对象,但不储存到数据库
$attributes = factory('App\Course')->raw();//返回一个数组
$attributes = factory('App\Course')->create();//直接创建插入数据库并返回一个对象

我们测试种需要传入数组,所以选择第二个函数 raw()
另外,这三个方法都可以传入一个数组作为参数,可以对生成的数据中的某些字段进行覆盖,由于我们需要测试 title,要令其为空字符串,所以最终我们添加的完整代码如下:

/** @test */
    public function a_course_reauires_a_title()
    {
        $attributes = factory('App\Course')->raw(['title' => '']);

        $this->post('/courses', $attributes)->assertSessionHasErrors('title');
    }

通过工厂生成一组新的数据,同时覆盖其原本生成的 title 值,改为空字符串,然后传入我们的从测试代码,最后判断是否会收到一个关于 title 的异常,结果再次测试通过。
description 的测试类似,不再赘述。

最后

这就是整个的一个基本流程演示,刚开始编写的时候确实比较慢,但是随着你的测试越写越多,后面的开发会越来越快,并且良好的测试体系让你重构的时候充满信心,一旦你有任何的错误,你一运行测试就会立即知道。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!