我正在使用Laravel和Laravel Scout(以Algolia作为搜索后端)构建一个系统来管理公司的一些文章。
其中一项要求指出,只要更改文章中的某些内容,便会保留备份,以便我们证明在特定时间显示了某些信息。
我通过在更新之前克隆具有所有关系的现有文章来实现这一点。这是Article模型上的方法:
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。
但是:阻止侦察兵为模型建立索引的唯一方法是,如果模型的archived_at
字段设置为任何非null
值。但是,由于这是原始模型的副本,因此该字段将按预期设置为null
,并且仅在完成克隆过程后才更改。
问题:侦察员正在将克隆的模型同步到Algolia,所以我在那里重复了。我知道如何解决这个问题,方法是将克隆调用包装到withoutSyncingToSearch
(https://laravel.com/docs/5.6/scout#pausing-indexing)回调中。
但是,由于这非常重要,并且该错误已经存在,因此我想进行单元测试以支持我,因为它确实没有同步到Algolia。
我不知道如何进行测试,而寻找一种测试Scout的方法只会导致答案,告诉我不要测试Scout,而是可以对我的模型进行索引等。
问题:我如何创建一个单元测试来证明克隆的模型未同步到Algolia?
目前,我正在考虑创建一个自定义的Scout驱动程序进行测试,但这似乎对于测试一个功能完全是过头了。