orbituw / faketories
一个帮助在Laravel中进行单元测试时伪造API以创建数据集的包
Requires
- php: >=5.6
- fzaninotto/faker: ^1.6
- illuminate/support: 5.*.*
Requires (Dev)
- orchestra/testbench: 3.1
- phpunit/phpunit: 5.*
This package is auto-updated.
Last update: 2024-08-26 03:59:28 UTC
README
这个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创建了一个伪造网关以生成所需的数据。
// 逻辑步骤
创建一个接口,列出真实网关将调用的所有方法,以便伪造网关可以执行相同的操作。
创建一个接口,使得“伪造网关”实现与真实网关相同的方方法,以确保伪造和真实网关可以绑定到Laravel的应用程序容器中,并在没有问题的情况下进行交换。
确保伪造网关具有与将要访问“真实”API的类完全相同的方法和属性。
修改访问“真实”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);
}
享受吧 :-)