如何在拥有Laravel的工厂内使用工厂?
我有一个创建StreetAddress的工厂,我想在创建信用卡的工厂中使用它 好:这与预期一样,为street_地址创建一个带有stdClass的CreditCard对象,并且属性都很好如何在拥有Laravel的工厂内使用工厂?,laravel,testing,Laravel,Testing,我有一个创建StreetAddress的工厂,我想在创建信用卡的工厂中使用它 好:这与预期一样,为street_地址创建一个带有stdClass的CreditCard对象,并且属性都很好 <?php use FuquIo\LaravelAccounting\Orm\CreditCard; use FuquIo\LaravelCommonRelatables\Locatable\StreetAddress; use FuquIo\LaravelUser\Access\User; $fact
<?php
use FuquIo\LaravelAccounting\Orm\CreditCard;
use FuquIo\LaravelCommonRelatables\Locatable\StreetAddress;
use FuquIo\LaravelUser\Access\User;
$factory->define(CreditCard::class, function (\Faker\Generator $faker){
$street_address = factory(StreetAddress::class)->make();
return [
'customer_id' => User::root()->getKey(),
'cardholder' => $faker->firstName . ' ' . $faker->lastName,
'nick_name' => $faker->company,
// LOOK HERE: this works
'street_address' => function () use ($street_address) { return (object) $street_address->toArray(); }
];
});
仅供参考:当我单步执行时,调试器会在所有情况下显示正确的类。假设您也有一个用于
StreetAddress的工厂,那么您应该能够执行以下操作:
$factory->define(CreditCard::class, function (\Faker\Generator $faker){
return [
'cardholder' => $faker->firstName . ' ' . $faker->lastName,
'nick_name' => $faker->company,
'street_address' => function () {
return factory(App\StreetAddress::class)->create()->toArray();
}
];
});
这提出了一个有趣的观点。create()vs make()如果我要嵌套工厂,我需要小心create()用伪造数据填充数据库。@TarekAdam如果工厂用于单元测试,那么它可以包装在数据库事务中并回滚,因此不会保存任何记录。Ben的观点很好。Laravel有一个很好的单元测试特性,所以你只需要使用DatabaseTransactions测试类中的代码>。
use FuquIo\LaravelAccounting\Orm\CreditCard;
use FuquIo\LaravelCommonRelatables\Locatable\StreetAddress;
$factory->define(CreditCard::class, function (\Faker\Generator $faker){
//$street_address = factory(StreetAddress::class)->make();
return [
'cardholder' => $faker->firstName . ' ' . $faker->lastName,
'nick_name' => $faker->company,
// 'street_address' => function () use ($street_address) { return (object) $street_address->toArray(); }
'street_address' => factory(StreetAddress::class)->make()
];
});
$factory->define(CreditCard::class, function (\Faker\Generator $faker){
return [
'cardholder' => $faker->firstName . ' ' . $faker->lastName,
'nick_name' => $faker->company,
'street_address' => function () {
return factory(App\StreetAddress::class)->create()->toArray();
}
];
});