cell0/laravel-generic-tests

本包的目标是让大型Laravel应用的开发者能够以快速且以测试驱动的方式轻松测试他们Laravel应用中的通用部分。

dev-master 2018-11-14 16:43 UTC

This package is auto-updated.

Last update: 2024-09-15 04:52:37 UTC


README

#Laravel 通用测试 : LGT

本包的目标是让大型Laravel应用的开发者能够以快速且以测试驱动的方式轻松测试他们Laravel应用中的通用部分。

ResourceTestCase 的主要思想

我们希望有一个通用的类来测试我们API的所有JSON资源响应。由于我们的响应总是对应Eloquent模型的简化版本,并做了一些修改,我们可以假设以下内容:

如果我们知道要测试的资源以及要测试的模型,我们将开始验证响应中所有未修改的属性与模型的值是否相同。资源上的所有其他属性都需要由 resourceTestCase 指定,以表明我们期望它们如何修改。

这个资源测试器将运行一个名为 it_passes_the_spec() 的单个测试,基于给定的规范,将创建一组自定义断言来断言资源符合规范。

用法

基本用法

最通用的响应只包含与原始模型对应的值和键。

要设置此环境,您需要扩展 ResourceTestCase 并设置期望资源拥有的 $modelclass$resourceclass$attributes

我们决定声明期望的属性,以允许测试驱动的方法。

class Response extends BaseResourceTestCase
{
    protected $modelClass = Model::class;
    protected $resourceClass = ModelResource::class;

    protected $attributes = [
        'id',
        'name',
        'lasers',
    ];
}
别名

当响应中的键是模型实际属性的别名时,会遇到更复杂的情况。要添加它,在类中添加一个别名数组,其中别名的键是资源中属性的名字,值是模型中属性的名字。

    protected $aliases = [
        'full_name' => 'name'
    ];
关系

对于使用关系的资源,我们确保只在资源加载了这些关系后显示这些关系。要测试关系,请在您的类中添加一个数组,如第一个示例所示。

该数组可以是值列表,其中每个值都是关系的名称,也可以是键值列表,当关系是别名或两者的组合时。

我们断言关系名称出现在资源响应中,我们不断言返回的值是否正确,因为我们期望您使用其他资源来构建这些值,并且这些资源已经有了它们自己的测试。

    protected $relations = [
        // key name on resource => attribute name on model 
        'alias_name' => 'relation_name',
        // key name and attribute name are the same. 
        'relation_name'
    ];
转换

对于转换数据的资源,我们有一个转换数组。转换是模型在设置到资源时数据已修改的任何事件。例如,日期格式化或访问器。

    protected $transformations = [
        'order_date',
        'full_name'
    ];

由于我们期望访问器是转换的最常见用例,因此此数组的默认行为用于检查模型上是否存在具有相同名称的属性。

在更复杂的情况下,例如日期格式,您需要编写自定义方法来断言转换按预期发生。为此,您需要将转换键的名称转换为驼峰式,并在前面加上单词 assert,如下所示:

assert'CamelCasedAttributeName'($model, $resourceAttrValue)'

以上例子的顺序函数如下:

   public function assertOrderDate($model, $resourceAttrValue){
       $this->assertEquals($resourceAttrValue, $model->created_at->format('Y-d-m h:m:s');
   }
杂项

我们当前解决方案添加的唯一断言函数是函数

assertIsNullable($attribute)

该函数检查给定属性在资源响应中是否可以为空。此函数只能在您创建的转换断言中调用,如果您不传递属性,它将检查当前正在评估的属性是否可以为空。

未来开发

我们计划与资源测试器一起采取下一步行动

  1. 通过服务提供者启用它,使其更容易更换。
  2. 将ResourceTester应用于所有可用资源。
  3. 使用工厂模式选择要使用的测试器(目前我们需要许多if检查来确定需要测试什么)
  4. 启用具有转换但没有关系的资源的测试
  5. 在SingleClassImplementation中更换测试用例依赖项。