我正在使用 flex 搜索的节点项目上。我的测试链是gulp,mocha,chai,sinon。我很难使我的集成测试能够始终如一地工作。我想将样本数据加载到数据库中,然后对其进行一些测试。我相信我遇到了问题,因为我正在加载的文档在使用它们的测试运行时并未被索引。
我通过以下方法解决了这个问题:
before(function (done) {
testData.simpleLoadData(100, 2000);
setTimeout(function () {
done();
}, 5000);
});
这在本地工作正常,偶尔在travis上工作。当我将计时器设置为10000时,它通常可以在两个地方工作。
有没有办法在测试代码中不诉诸setTimeouts?手动处理时间会让我有些胆怯。
手动处理超时是我最好的选择,还是有更好的方法?
注意:这些是集成测试,我明确希望使用外部依赖项。我的单元测试已经不依赖数据库了。
最佳答案
这里有两件事可能会让您失望:分片分配和刷新周期。
当您创建新索引时,可能会发生第一个事件。主服务器确认请求并开始创建过程后,Create Index api将返回200 OK。但是实际的分片分配在后台异步发生。而且虽然速度很快,但是有时可以在索引完全启动和运行之前执行集成测试,从而在尝试为文档建立索引时导致错误。
最简单的方法是创建索引,然后使用wait_for_status=green
(或黄色,取决于您是否使用副本)来调用Health API。该调用将一直阻塞,直到完全分配了索引。
下一个问题涉及搜索的近实时性。默认情况下,Elasticsearch每秒刷新一次搜索索引。对于集成测试而言,这可能太慢,并且您的文档可能已建立索引,但在运行测试时不可搜索。
要解决此问题,请为所有文档建立索引,然后在目标索引上调用Refresh API。该调用返回后,您的文档将“处于 Activity 状态”并且可以搜索。
关于node.js - 使用Mocha进行集成测试时如何处理Elasticsearch的索引计时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36665873/