0

我正在尝试为关系运行一个伪造的工厂,但该字段始终返回 NULL。如何在访问数据库的情况下伪造模型关系?

我有一个与父事件表一对一关系的地图工厂。我需要伪造这种关系以进行单元测试:

/**
 * Define the model's default state.
 *
 * @return array
 */
public function definition()
{
    return [
        'event' => 'faker.' . join('_', $this->faker->words),
        'category' => $this->faker->word,
        'sub_category' => $this->faker->word,
        'priority' => $this->faker->randomElement(['normal', 'high']),
        'event' => Event::factory()->makeOne(),
    ];
}

这会从调试器返回一个假模型,但event为空:

result = {array} [5]
 event = "faker.eum_voluptatibus_aut"
 category = "libero"
 sub_category = "aut"
 priority = "high"
 event = null

我尝试使用状态,但同样的事情发生了:

public function disabled()
{
    return $this->state([
        'event' => Event::factory()->makeOne(['enabled' => false]),
    ]);
}

该对象返回一个空event值。我需要一个可以横向进入的伪造对象:if ($object->event->enabled) [...]. 如何生成假模型关系?

4

2 回答 2

1

如果您使用的是 Laravel 8.x,则必须考虑使用文档中使用的方法,它必须如下所示:

/**
 * Define the model's default state.
 *
 * @return array
 */
public function definition()
{
    return [
        'event' => 'faker.' . join('_', $this->faker->words),
        'category' => $this->faker->word,
        'sub_category' => $this->faker->word,
        'priority' => $this->faker->randomElement(['normal', 'high']),
        'event_id' => Event::factory(),
    ];
}

/**
 * Indicate that the map is disabled.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function disabled()
{
    return $this->state([
        'event_id' => Event::factory()->create(['enabled' => false]),
    ]);
}
于 2020-12-16T10:08:12.650 回答
0

到目前为止,我发现的唯一解决方案是event在我的测试中自己手动设置密钥。这不是理想或优雅的解决方案。

$fieldMap = Map::factory()->makeOne();
$fieldMap->event = Event::factory(['enabled' => false])->makeOne();

我不喜欢这种方法。为什么我不能在工厂中定义工厂?

于 2020-09-17T17:34:17.187 回答