首页 > 解决方案 > 断言模型不可搜索

问题描述

我正在构建一个系统来管理我公司的一些文章,使用 Laravel 和 Laravel Scout 以及 Algolia 作为搜索后端。

其中一项要求规定,每当文章中的某些内容发生更改时,都会保留备份,以便我们可以证明某些信息是在特定时间显示的。

我通过在更新之前克隆现有文章及其所有关系来实现这一点。这是文章模型上的方法:

public function clone(array $relations = null, array $except = null) {
    if($relations) {
        $this->load($relations);
    }

    $replica = $this->replicate($except);
    $replica->save();

    $syncRelations = collect($this->relations)->only($relations);

    foreach($syncRelations as $relation => $models) {
        $replica->{$relation}()->sync($models);
    }

    return $replica;
}

问题是$replica->save()线路。我需要先保存模型,以便在同步关系时它有一个 ID。

但是:阻止 scout 索引模型的唯一原因是模型的archived_at字段是否设置为任何非null值。但由于这是原始模型的克隆,因此该字段null按预期设置,并且仅在克隆过程完成后更改。

问题: Scout 正在将克隆模型同步到 Algolia,所以我在那里有重复。我知道如何通过将克隆调用包装到withoutSyncingToSearchhttps://laravel.com/docs/5.6/scout#pausing-indexing)回调中来解决这个问题。但是由于这非常重要并且错误已经存在,我希望有一个单元测试来支持我,它确实没有同步到 Algolia。我不知道如何测试这一点,并且寻找一种测试 Scout 的方法只会导致答案告诉我不要测试 Scout,而是我的模型可以被索引等。

问题:如何创建一个单元测试来证明克隆模型没有同步到 Algolia?

目前我正在考虑创建一个自定义的 Scout 驱动程序进行测试,但对于测试一个单一的功能来说,这似乎是一种过大的杀伤力。

标签: laravelunit-testinglaravel-5laravel-scout

解决方案


推荐阅读