如何在使用摩卡进行集成testing时处理elasticsearch的索引时间

我正在研究一个使用elasticsearch的节点项目。 我的testing链是吞咽,摩卡,柴,sin。 我很难让我的集成testing始终如一地工作。 我想加载数据库中的示例数据,然后运行一些testing。 我相信我有问题,因为我正在加载的文件没有索引我的testing使用它们运行的​​时间。

我已经通过执行以下操作来解决此问题:

before(function (done) { testData.simpleLoadData(100, 2000); setTimeout(function () { done(); }, 5000); }); 

这在当地正常工作,偶尔对travis有效。 当我把计时器升到10000时,一般都在两个地方工作。

有没有办法在这个testing代码诉诸setTimeouts? 手动处理时间使我有点娇气。

手动处理超时我有最好的select还是有更好的方法?

注意:这些是集成testing,我明确地想要使用外部依赖关系。 我有单位testing,不依赖于数据库已经。

这里有两件事可以让你起床:碎片分配和刷新周期。

当你创build一个新的索引时,第一个可能会发生。 一旦主服务器确认请求并开始创build过程,Create Index API将返回200 OK。 但是实际的分片分配是在后台asynchronous发生的。 尽pipe速度很快,但是在索引完全启动并运行之前,集成testing有时可能会执行,当您尝试索引文档时会导致错误。

使其健壮的最简单的方法是创build索引,然后用wait_for_status=green (或黄色,取决于是否使用副本)调用Health API 。 这个调用将被阻塞,直到索引被完全分配为止。

下一个问题涉及search的近实时方面。 默认情况下,Elasticsearch每秒刷新一次search索引。 对于集成testing来说,这可能太慢,并且您的文档可能会被编入索引,但在您的testing运行时不可search。

要解决这个问题,请索引所有文档,然后在目标索引上调用Refresh API 。 一旦这个调用返回,您的文档将“实时”和可search。