orbituw/faketories

一个帮助在Laravel中进行单元测试时伪造API以创建数据集的包

0.0.1 2017-08-16 13:51 UTC

This package is auto-updated.

Last update: 2024-08-26 03:59:28 UTC


README

pipeline status

coverage report

这个Laravel包提供了一种特质,可以帮助在单元测试期间从伪造的API返回数据集。

如果您看过Adam Wathan的测试驱动Laravel系列,您会看到他建议在需要与互联网通信的类进行测试时,将“伪造”对象或网关类交换到Laravel应用程序容器中。

如果您之前使用过Laravel的模型工厂,使用faketories应该方便且易于识别。

入门指南

您可以通过Composer安装此包

composer require orbituw/faketories --dev

在您的config/app.php文件的providers数组中注册包:(Laravel 5.5+用户可以跳过此步骤)

\OrbitUW\Faketories\FaketoriesServiceProvider::class,

生成一个示例的/tests/faketories/faketories.php定义文件

php artisan faketories:install 

使用示例

// 给出真实世界中的vrm查询示例

在下面的示例中,我们需要测试是否可以从API获取车辆的完整详细信息,以便在应用程序中展示这些信息,因此我们使用faketories创建了一个伪造网关以生成所需的数据。

// 逻辑步骤

  1. 创建一个接口,列出真实网关将调用的所有方法,以便伪造网关可以执行相同的操作。

  2. 创建一个接口,使得“伪造网关”实现与真实网关相同的方方法,以确保伪造和真实网关可以绑定到Laravel的应用程序容器中,并在没有问题的情况下进行交换。

  3. 确保伪造网关具有与将要访问“真实”API的类完全相同的方法和属性。

  4. 修改访问“真实”API的方法,使其指向Faketories生成的伪造数据,以便可以测试这些方法。

// 实现

app/Providers/AppServiceProvider.php中,将通用接口绑定到Laravel容器中的真实网关。

    public function register()
    {
         $this->app->bind(VehicleGatewayInterface::class, RealVehicleApi::class);
    }

然后在您的测试类中,将接口绑定到伪造网关的特定实例。

    public function test_you_can_get_vehicle_by_reg()
    {

        //create new instance of fake gateway
        $vehicleApi = new FakeVehicleApi();
 

        //generate a new faketory data set with specific values
        $vehicleApi->generate([
            'reg_no' => 've59hgp',
            'make' => 'audi',
        ]);
 

        //generate additional 5 totally random sets
        $vehicleApi->generate([], 5);
 

        //finally bind the interface to this gateway
        $this->app->instance(VehicleApiInterface::class, $vehicleApi);
    }

在您的测试目录中,您将有一个包含faketories.php的faketories目录

$faketory->define(\Tests\FakeVehicleApi::class, function( Generator $faker ){

    $transmissions = ['Manual', 'Auto'];

    return [
        'reg_no' => $faker->unique()->name,
        'make' => $faker->name(),
        'model' => $faker->numberBetween(100,400),
        'colour' => $faker->colorName,
        'year' => $faker->year,
        'engine' => $faker->numberBetween(500, 4000),
        'transmission' => $transmissions[ array_rand($transmissions) ],
    ];
});

如果您之前使用过Laravel的模型工厂,这可能会让您感到熟悉。您可以定义一个类以及您希望它返回的一组示例数据。每个定义都会传入一个faker库的实例,这样您可以快速创建伪造数据集。

然后您必须创建一个新的FakeApi类,它将被用来为伪造API创建测试端点。

class FakeVehicleApi implements VehicleApiInterface
{
    //import faketories trait
    use Faketories;
 

    public function getVehicleByReg($reg)
    {
        return $this->data->filter(function($vehicle) use($reg){
           return $vehicle->reg_no === $reg;
        })->first();
    }
}

注意,我们正在使用Faketories特质,它为我们提供了一个名为$data的属性,该属性将包含由Faketories特质生成所有数据。$data是一个Collection,您可以使用任何集合管道来操作该属性。

现在,当进行测试时,Faketory将产生作为伪造API的数据

    public function test_you_can_get_vehicle_by_reg()
    {
        $vehicle = new FakeVehicleApi();
        $vehicle->generate([
            'reg_no' => 'TE57 ING'
        ]);
    
        $response = $vehicle->getVehicleByReg('TE57 ING');

        $this->assertEquals('TE57 ING', $response->reg_no);

    }

享受吧 :-)