Laravel 在我们的测试中,我们是否也应该使用那些仅用于更改数据库中数据的迁移?

Laravel 在我们的测试中,我们是否也应该使用那些仅用于更改数据库中数据的迁移?,laravel,unit-testing,testing,migration,functional-testing,Laravel,Unit Testing,Testing,Migration,Functional Testing,我们有一系列迁移(200+),其中大多数迁移都是为了更改数据库中的数据,这会影响我们的测试。例如,我们有一个这样的迁移 public function up() { $deleteId = DB::table('lookups') ->where('code', '=', 'VI') ->where('type', '=', 'country') ->where('value',

我们有一系列迁移(200+),其中大多数迁移都是为了更改数据库中的数据,这会影响我们的测试。例如,我们有一个这样的迁移

 public function up()
    {
        $deleteId = DB::table('lookups')
            ->where('code', '=', 'VI')
            ->where('type', '=', 'country')
            ->where('value', '=', 'U.S. Virgin Islands')
            ->first(['id'])->id;

           DB::table('lookups')
                ->where('id', '=', $deleteId ?? 0)
                ->update(['deleted_at' => Carbon::now()->toDateTimeLocalString()]);
    }


如您所见,如果我们在测试环境中运行它,这将抛出一个错误。因为测试环境中不存在该记录。(我们正为此目的使用faker)。我的问题是,我们应该如何跳过这种迁移,或者最好的解决方案是什么。我将在我的回答中做出一些假设,因此请检查这些假设,如果有任何假设不正确,请告诉我

  • 您是开发团队的一员
  • 在客户环境中,如果迁移运行时记录不存在,则环境中会出现错误
  • 您没有在此测试中显式测试此迁移
  • 好的,首先我的脑海里响起了一些警钟。本质上,您是说您的测试环境与客户环境不匹配。当然,这不一定是个问题,但一定要确保您的测试环境能够充分代表客户环境,使测试有意义

    在理想情况下,我会通过确保您的假环境具有迁移所需的记录来避免错误。这样,您也可以在迁移运行时进行迁移

    您是否为测试提供了假数据库,例如内存中的数据库?如果是这样,只需在数据库启动时添加记录,即可运行迁移


    你在模拟对数据库的调用吗?如果是这样的话,您是否尝试过模拟对该函数的调用,并从本质上说使其成为无操作?

    您可以在一个查询中完成,然后它不会抛出。