Laravel 测试值是否会改变的最佳方法

Laravel best approach for Testing if a value will change

代码

我有一个数据库,其中有一个 table 用于团队和讲师的数据库:

| id | team_id | instructor_id | ... |

每 24 小时运行一个批处理,更新该团队的讲师。
我需要创建的是一个简单的测试,以检查批次是否 运行 正确,并且讲师已更改。

问题

批处理 随机更新讲师 ,这意味着同一位讲师可能会被选择两次,从而在 运行 测试时抛出错误。我尝试检查 updated_at 列是否更改,但似乎将相同的值传递给 update() Laravel 不会更改所述列。

问题

我应该如何检查讲师是否有变化?
我只负责做测试,所以我不应该改变批处理的操作方式(比如强制它以便 updated_at 改变)
但是,在更换讲师之前进行 for 循环看起来非常难看。
而且因为导师只有3到5人,同一位导师连续被选中几次的几率也不低。

更新

这是请求的代码。
测试文件:

class InstructorSelectionOrderTest extends TestCase
{
    use RefreshDatabase;

    ...

    /**
     * @test
     * @group instructorSelection
     *
     * @return void
     */
    public function test_old_team_instructor_random()
    {
        $team = factory(RoutineTeam::class)->create(['instructor_id' => 4, 'updated_at' => Carbon::now()->subDays(1)]);
        $room = factory(Room::class)->create(['team_id' => $team->id]);

        $this->createNewUser($team->id, $room->id);

        $this->artisan('project:reassign_instructors')->assertExitCode(0);

        $result = RoutineTeam::where('id', $team->id)->get();

        $this->assertFalse($result[0]->updated_at == $team->updated_at);
    }

批次:

class ReassignInstructors extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'project:reassign_instructors';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //list of rooms that needs to be updated
        $routineTeams = RoutineTeam::openedRoomTeams();

        ...

        foreach ($routineTeams as $routineTeam) {
            //Instructor::getRandomInstructor()->id = random number from 1 to 4
            $routineTeam->instructor_id = Instructor::getRandomInstructor()->id;
            $routineTeam->save();
        }

        return 0;
    }
}

常规团队table:

| id | team_id | instructor_id | ... | updated_at

测试目前有 25% 的失败几率。我只能编辑测试文件。有没有办法只通过更改测试文件使其失败的可能性为 0%?

由于在您的测试中 instructor id 是静态的,我猜它没有外键约束。

那么,为什么不将 instructor_id 设置为 0,然后 运行 作业(或任何不存在的 ID)。

 /**
     * @test
     * @group instructorSelection
     *
     * @return void
     */
    public function test_old_team_instructor_random()
    {
        //setting the id to 0 so it is forced to change on 'project:reassign_instructors' command
        $team = factory(RoutineTeam::class)->create(['instructor_id' => 0, 'updated_at' => Carbon::now()->subDays(1)]);
        $room = factory(Room::class)->create(['team_id' => $team->id]);

        $this->createNewUser($team->id, $room->id);

        $this->artisan('project:reassign_instructors')->assertExitCode(0);

        $result = RoutineTeam::where('id', $team->id)->get();

        $this->assertFalse($result[0]->updated_at == $team->updated_at);
    }