最小化测试中的工厂?
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();
目前我在测试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();