invertus / prestashop-models
此包提供测试数据库驱动应用程序的能力。模型工厂使得使用 Prestashop 模型创建测试数据库记录更加容易。
Requires
- php: >=5.6.0
- ext-json: *
- fakerphp/faker: 1.9.2
- invertus/knapsack: ^10.0
- symfony/console: 3.4.47
README
此包提供测试数据库驱动应用程序的能力。模型工厂使得使用 Prestashop 模型创建测试数据库记录更加容易。
安装
使用 composer 需要此包。建议仅将包用于开发。
composer require invertus/prestashop-models --dev
定义模型工厂
概念概述
在测试时,您可能需要在执行测试之前将一些记录插入到数据库中。在创建测试数据时,您不必手动指定每个列的值,此包允许您使用模型工厂为每个 Prestashop 模型定义一组默认属性。
要查看如何编写工厂的示例,请查看您应用程序中的 tests/Factories/Models/UserFactory.php 文件。
namespace Tests\Factories\Models;
use Invertus\Prestashop\Models\Factory\Factory;
use Customer;
class CustomerFactory extends Factory
{
protected $model = Customer::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
];
}
}
`
如你所见,在最基本的形式中,工厂是扩展此包的基工厂类的类,并定义 definition 方法。该 definition 方法返回在创建模型时应应用的默认属性值集。
通过 faker 属性,工厂可以访问 Faker PHP 库,允许您方便地生成各种类型的随机数据以进行测试。
{提示} 您可以通过在工厂类中重写 withFaker() 函数来覆盖 faker。
生成工厂
要创建工厂,执行 make:factory
php vendor/bin/prestashop-models make:factory ProductFactory
要创建具有不同于 {model}Factory 的特定名称的工厂,请执行此命令
php vendor/bin/prestashop-models make:factory TestProductFactory --model="\Product"
--model 应具有完整的模型命名空间。
新的工厂类将放置在您的 tests/Factories/Models 目录中。
工厂状态
状态操作方法允许您定义可以应用于模型工厂的离散修改,可以组合使用。例如,您的 Tests\Factories\Models\CustomerFactory 工厂可能包含一个 suspended 状态方法,该方法修改其默认属性值之一。
状态转换方法通常调用由包的基工厂类提供的 state 方法。该 state 方法接受一个闭包,该闭包将接收为工厂定义的原始属性数组,并应返回要修改的属性数组。
/**
* Indicate that the customer is suspended.
*
* @return self
*/
public function suspended()
{
return $this->state(function (array $attributes) {
return [
'account_status' => 'suspended',
];
});
}
工厂回调
使用 afterMaking 和 afterCreating 方法注册工厂回调,允许您在创建或创建模型后执行其他任务。您应通过在工厂类上定义 configure 方法来注册这些回调。此方法将由 Laravel 在实例化工厂时自动调用。
namespace Tests\Factories\Models;
use Invertus\Prestashop\Models\Factory\Factory;
use Customer;
class CustomerFactory extends Factory
{
/**
* Configure the model factory.
*
* @return $this
*/
public function configure()
{
return $this->afterMaking(function (Customer $customer) {
//
})->afterCreating(function (Customer $customer) {
//
});
}
// ...
}
使用工厂创建模型
实例化模型
一旦您已定义了工厂,您可以使用由 Illuminate\Database\Eloquent\Factories\HasFactory 特性提供的模型提供的静态 factory 方法来为该模型实例化工厂实例。让我们看看创建模型的几个例子。首先,我们将使用 make 方法创建不将模型持久化到数据库的模型。
use Tests\Factories\Models\CustomerFactory;
public function test_models_can_be_instantiated()
{
$customer = CustomerFactory::initialize()->make();
// Use model in tests...
}
您可以使用 count 方法创建许多模型的集合。
$customers = CustomerFactory::initialize()->count(3)->make();
应用状态
您还可以将任何状态应用到模型上。如果您想将多个状态转换应用到模型上,您可以直接调用状态转换方法。
$customers = CustomerFactory::initialize()->count(5)->suspended()->make();
覆盖属性
如果您想覆盖模型的一些默认值,您可以将值数组传递给 make 方法。只有指定的属性将被替换,其余属性将保持为工厂指定的默认值。
$customer = CustomerFactory::initialize()->make([
'name' => 'Abigail Otwell',
]);
持久化模型
create 方法实例化模型实例,并使用模型的 save 方法将它们持久化到数据库中
use Tests\Factories\Models\CustomerFactory;
public function test_models_can_be_persisted()
{
// Create a single App\Models\User instance...
$customer = CustomerFactory::initialize()->create();
// Create three App\Models\User instances...
$customers = CustomerFactory::initialize()->count(3)->create();
// Use model in tests...
}
您可以通过向 create 方法传递一个属性数组来覆盖工厂的默认模型属性
$customer = CustomerFactory::initialize()->create([
'name' => 'Abigail',
]);