如果你想为你的 Laravel 项目写一些测试,那么你可能需要在某个时候编写一些工厂模式。 当我第一次听到工厂一词时,我不知道它的含义和作用,更不用说了解它们可以为你的测试带来的好处了。
假设你有一个产品 Controller,该控制器具有一种存储方法来保存新产品的详细信息。 产品可能具有产品代码,标题,价格,描述和标签等属性,这些都在请求中发送到 store 方法。
我的官方群点击此处。
如果你想测试这个 endpoint,可以创建一个属性数组,然后在 POST 请求中发送它
$product = [
'product_code' => 'ABC123',
'title' => 'My Amazing Product',
'price' => 100,
'description' => 'This product will change the way you wash your dishes forever',
'tagline' => 'Voted best in category'
];
$response = $this->post(route('products.store'), $product);
// 你的断言
$response->assertSuccessful();
这么做没问题。
但是如果你想在另一个测试中使用该 product,比如测试更新 product,你不得不在下一个测试方法中复制该数组, 或者可以将其提取到测试的 setUp () 方法中 并使其成为 $this->product 以重复利用。
如果你还有另一个测试类要测试将 product 添加到 category 中,那你该怎么办?怎样才能重用你的产品代码?你会如何定义不同模型之间的关系? 幸运的是,工厂模式可以解决这些问题。
Creating a factory
你可以通过创建相应的工厂方法来产生你所需要的数据。 这里提供了一个 artisan 命令可以帮助你快速的、根据你的模型创建对应的工厂方法。
php artisan make:factory ProductFactory --model=Product
执行上面命令后,你会在 database/factories 目录下看到一个以你的 Product 模型为基础的,名为 ProductFactory.php 的文件,你可以通过自定义字段名,以及该字段需要的值来获取你需要的数据。下面是一个例子:
use Illuminate\Support\Str;
use Faker\Generator as Faker;
$factory->define(App\Product::class, function (Faker $faker) {
return [
'product_code' => 'ABC123',
'title' => 'My Amazing Product',
'price' => 100,
'description' => 'This product will change the way you wash your dishes forever',
'tagline'