Php 用于测试的工厂上的Laravel嵌套关系
我有个问题,我不得不承认我没有找到任何解决办法。 我实际上正在开发一些功能测试,工厂正在阻止我 首先,我尝试添加一个名为“任务列表”的实体,它包含一个或多个“部分”,其中包含一个或多个“操作”。 我有三个层次的深厚感情 这里是我的工厂:Php 用于测试的工厂上的Laravel嵌套关系,php,oop,laravel,laravel-5,Php,Oop,Laravel,Laravel 5,我有个问题,我不得不承认我没有找到任何解决办法。 我实际上正在开发一些功能测试,工厂正在阻止我 首先,我尝试添加一个名为“任务列表”的实体,它包含一个或多个“部分”,其中包含一个或多个“操作”。 我有三个层次的深厚感情 这里是我的工厂: $factory->define(\App\V2\Models\Tasklist::class, function (\Faker\Generator $faker) { return [ 'id_course'
$factory->define(\App\V2\Models\Tasklist::class, function (\Faker\Generator $faker) {
return [
'id_course' => \App\V2\Models\Program::all()->random(1)->id,
'id_event' => \App\V2\Models\Stage::all()->random(1)->id,
'id_course_rounds' => \App\V2\Models\ProgramRound::all()->random(1)->id,
'name' => $faker->word,
'display_name' => $faker->word,
'color' => 0,
'key' => str_random(16),
'auto_active' => 1,
'status' => 1,
];
});
$factory->define(\App\V2\Models\TasklistSection::class, function (\Faker\Generator $faker) {
return [
'id_tasklist' => function(){
return factory(\App\V2\Models\Tasklist::class)->create()->id;
},
'number' => 1,
'title' => $faker->word,
'text' => $faker->text(100),
'status' => 1
];
});
$factory->define(\App\V2\Models\TasklistAction::class, function(\Faker\Generator $faker) {
return [
'id_tasklists_section' => factory(\App\V2\Models\TasklistSection::class)->create()->id,
'number' => rand(1, 10),
'title' => $faker->word,
'percent' => $faker->numberBetween(0, 100),
'status' => 1
];
});
在我的测试类中,我试图生成一个任务列表,其中包含一个部分和一个操作。我发现的唯一方法是这样的:
$task = factory(Tasklist::class, 2)->create()
->each(function($t){
$t->sections()->save(factory(TasklistSection::class)->create()
->each(function($s){
$s->actions()->save(factory(TasklistAction::class)->create());
})
);
});
对于这段代码,如果我每次删除第二个,它就会工作,我会得到2个任务列表,每个任务列表有1个部分。事实上,每个人都在困扰着我
我只想创建一个任务列表,其中包含一个或多个部分,其中包含一个或多个操作
但是each只接受集合输入save方法只接受模型输入而不接受集合
有人知道如何处理吗?一种方法可以是:
创建带有分区的任务并将其存储在变量中,然后循环遍历每个任务分区并向其中添加操作,如下所示:
$tasklist = factory(App\Tasklist::class)->create();
$tasklist->sections()->saveMany(factory(App\TasklistSection::class, 3)->make());
foreach ($tasklist->sections as $section){
$section->actions()->saveMany(factory(App\TasklistAction::class, 3)->make());
}
这将按预期工作。您找到解决方案了吗?是的,我将每个工厂单独放置,并返回父容器的id。任务列表的工厂返回id,然后我用这个takslist id创建2个部分,然后用该部分创建5个操作,等等…可能的重复