最小化测试中的工厂?

Minimize factories in test?

目前我在测试class中使用了很多工厂factory(),有没有办法减少到1所以我只能在测试方法中使用factory(Something::class)

我使用很多的原因是因为我必须传递一些外键。

$user = factory(User::class)->create();

$token = factory(Token::class)->create([
    'user_id' => $user->id,
]);

$provider = factory(Provider::class)->create([
    'user_id'       => $user->id,
    'token_id'      => $token->id,
]);

$something = factory(Something::class)->create([
    'provider_id' => $provider->id,
]);

   // Now test with $something

你可以使用这样的语法:

$factory->define(Something::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'provider_id' => function () {
            return factory(Provider::class)->create()->id;
        }
    ];
});

$factory->define(Provider::class, function ($faker) {
    $user = factory(User:class)->create();
    return [
        'user_id' => $user->id,
        'token_id' => function () {
            return factory(Token::class)->create(['user_id' => $user->id])->id;
        }
    ];
});

然后在你的测试中你只能使用:

$something = factory(Something::class)->create();

请注意,根据您的需要,它可能会导致一些副作用 - 例如,当使用 Provider 工厂时,将始终创建用户,这取决于您的测试。当然,如果需要,您始终可以创建辅助方法,该方法将包装您显示的所有这些方法和 return 一些东西,然后在您的测试中您只能使用:

$something = $this->createSomething();