我正在构建一个系统来管理我公司的一些文章,使用 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,所以我在那里有重复。我知道如何通过将克隆调用包装到withoutSyncingToSearch
(https://laravel.com/docs/5.6/scout#pausing-indexing)回调中来解决这个问题。但是由于这非常重要并且错误已经存在,我希望有一个单元测试来支持我,它确实没有同步到 Algolia。我不知道如何测试这一点,并且寻找一种测试 Scout 的方法只会导致答案告诉我不要测试 Scout,而是我的模型可以被索引等。
问题:如何创建一个单元测试来证明克隆模型没有同步到 Algolia?
目前我正在考虑创建一个自定义的 Scout 驱动程序进行测试,但对于测试一个单一的功能来说,这似乎是一种过大的杀伤力。