[新手开发记录] 验证数据的测试
我准备开发一个名校公开课的汉化资料下载和讨论版,功能就是站长发布信息和资料下载链接,用户可以在下面讨论,并且可以生成各种平台的分享方式分享出去。这一系列文章就记录这一过程。当然博文功能也是必不可少的。
新建一个测试
我们已经测试了数据完备的情况下,可以新建一个 course。
但是数据如果不完备,我们应该要能够验证并报错,所以我们新建一个测试,如下:
/** @test */
public function a_course_reauires_a_title()
{
$this->post('/courses', [])->assertSessionHasErrors('title');
}
解释起来就是,注意看第二个参数是 []
,一个空数组,也就是说没有 title
可以看到,所以我们就期待看到一个关于 title
的异常,也就是这段代码的含义 assertSessionHasErrors('title')
。
那么这时候自然会报错,因为我们并没有对 title
进行数据验证,所以我们进入 CoursesController
的 store()
方法,将验证写出来,顺便把 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 协议》,转载必须注明作者和本文链接