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);
}
代码
我有一个数据库,其中有一个 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);
}