微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以使用 Migrating 和 Seed Once 进行 InMemory 测试

如何解决是否可以使用 Migrating 和 Seed Once 进行 InMemory 测试

我正在使用内存数据库编写功能测试

我最近安装了一个插件,laravel 权限。

之前,我的 profile_id 表中有一个简单的 users 字段。因此,我只需要使用 refreshDatabase trait 创建一个用户并针对每个用户测试对其进行测试。速度很快。

现在我已经迁移到 Laravel 权限,我已经定义了超过 100 个权限。我必须迁移数据库并为每个测试播种。现在,每个测试最多需要 3 秒,我有 112 个测试,这只是开始。这种方式太慢了。

我尝试在我的 setUp() 方法中使用 MigrateAndSeedOnce 方法

trait MigrateFreshSeedOnce
{
    /**
     * If true,setup has run at least once.
     * @var boolean
     */
    protected static $setUpHasRunOnce = false;
    /**
     * After the first run of setUp "migrate:fresh --seed"
     * @return void
     */
    public function setUp() :void
    {
        parent::setUp();
        if (!static::$setUpHasRunOnce) {
            Artisan::call('migrate:fresh');
            $this->seed('SourceTableSeeder'); 

            $this->seed('RoleTableSeeder');
            $this->seed('PermissionTableSeeder');

            $this->seed('RepartitionTableSeeder'); 

            $this->company = Company::factory()->create();
            $this->operation = Operation::factory()->create(['company_id' => 1]);
            $this->user = User::factory()->create(
                [
                    'email' => 'exapmle@company.com','company_id' => 1,'operation_id' => 1,]);
            $this->user->assignRole(User::SUPER_ADMIN);
            static::$setUpHasRunOnce = true;
        }
        $this->actingAs($this->user);

    }

这对第一个测试很有效,但对于第二个测试,$this->user 为空。

是否可以使用内存数据库执行此操作(这会更快),或者我必须切换到 sqlite DB(更慢),或者有其他更好的选择吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。