チームを作成してゲームに追加し、そのゲームをイベントに追加しようとしていますが、ゲームが作成されると自動的にイベントに添付するイベントが生成されます。通常の状況ではこれは問題ありませんが、最初の試合が行われているイベントと比べてチームの参加がテストされているため、特定の日付のイベントを作成する必要があります。最初にイベントを作成することはできません。なぜなら、ゲームを追加するためにはまずゲームを作成しなければならないからです。テストのあるLaravel Modalファクトリ
ゲームやイベントを正しく作成できるように、私のロジックを修正する提案がありますか?
私はこのエッジケースのために何をする必要があるのかわかりません。
/** @test */
public function a_team_with_a_game_after_they_started_the_season_cannot_have_their_joined_at_date_after_their_first_match()
{
$team = factory(Team::class)->create(['joined_at' => '2017-10-08']);
$game = GameFactory::create([], [$team]);
$event = EventFactory::create(['date' => '2017-10-09'], null, $game);
$validator = new BeforeFirstGameDate($team);
$this->assertFalse($validator->passes('joined_at', '2017-10-10'));
$this->assertEquals('The joined at date cannot be AFTER the team\'s first game.', $validator->message());
}
Factories
<?php
use App\Models\Game;
use App\Models\Team;
class GameFactory
{
public static function create($overrides = [], $teams = [])
{
$match = factory(Game::class)->create($overrides);
self::addTeamsForGame($teams, $game);
return $game;
}
/**
* @param $teams
* @param $game
*/
public static function addTeamsForGame($teams, $game)
{
$teamsForGame = [];
$numberOfTeamsToAdd = $numberOfTeams - count($teams);
if ($numberOfTeamsToAdd) {
$teamsForMatch = factory(Team::class, $numberOfTeamsToAdd)->create();
array_push($teams, $teamsForGame);
} else {
array_push($teams, $teamsForGame);
}
$match->addTeams($teamsForGame);
}
}
<?php
use App\Models\Event;
class EventFactory
{
public static function create($overrides = [], $totalNumberOfGames = 8, $games = [])
{
$event = factory(Event::class)->create($overrides);
$numberOfGamesToAdd = $totalNumberOfGames - count($games);
$gameToStartAt = count($games) + 1;
foreach (array_wrap($games) as $game) {
$game->addToEvent($event);
}
for ($gameNumber = $gameToStartAt; $gameNumber <= $numberOfGamesToAdd; $gameNumber++) {
GameFactory::create(['event_id' => $event->id, 'game_number' => $gameNumber]);
}
return $event;
}
}
$factory->define(App\Models\Game::class, function (Faker\Generator $faker) {
static $order = 1;
return [
'event_id' => function() {
return factory(App\Models\Event::class)->create()->id;
},
'game_number' => $order++,
];
});
$factory->define(App\Models\Event::class, function (Faker\Generator $faker) {
$name = $faker->sentence;
return [
'name' => $name,
'slug' => str_slug($name),
'date' => $faker->dateTimeBetween('-10 years'),
];
});
私は最初のイベントを作成した場合、私はゲームがそのイベントに追加し、それを渡すために作成されていません。 – user3732216
アプリのワークフローとは何ですか? –
イベントが作成されると、チームはゲームに割り当てられ、イベントに割り当てられます。 – user3732216