Laravel 9:如何在单元测试期间防止急切加载?

Laravel 9: how to prevent eager loading during unit-tests?

提问人:Majesty 提问时间:6/23/2023 更新时间:6/23/2023 访问量:26

问:

请考虑以下几点:Model

class Selection extends Model
{
    use HasFactory, SoftDeletes;

    protected $table = '...';

    public function subjects(): HasMany
    {
        return $this->hasMany(SelectionSubject::class);
    }
}

我急切地喜欢这样:subjects

$selection->subjects()->get()->pluck('code')->toArray()

它工作正常,除非我尝试对其进行单元测试,否则它会给我以下错误:

Illuminate\Database\QueryException : SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "subjects_table" does not exist

因此,显然它试图从数据库加载,而单元测试不存在该数据库。subjects

我尝试了以下方法:

public function boot()
{
        Model::preventLazyLoading();

        Model::handleLazyLoadingViolationUsing(function ($model, $relation) {
            $class = get_class($model);

            info("Attempted to lazy load [{$relation}] on model [{$class}].");
        });
}

但是由于某种原因,它对我不起作用 - 异常没有被提出,它一直在尝试访问数据库。

关于如何在单元测试中实际防止从数据库加载的任何想法?subjects

Laravel 单元测试 急切加载

评论

0赞 matiaslauriti 7/24/2023
首先,你不是在“急切加载”,你实际上是在使用一种关系,但绝对不是急切地加载它。其次,你必须有可用的数据库,即使它是一个“单元测试”,并且该代码(不是测试,而是测试的代码)使用你的模型。不要嘲笑他们,只是使用工厂并在他们身上有虚假数据。这就是你必须拥有的,它每次都会完美无缺地工作。即使它是一个“单元测试”,也要使用 而不是 PHPUnit 的\Tests\TestCaseTestCase

答: 暂无答案