[英]When testing an ExpressJS route using mocha+sinon, how do you “stub” a function that's local to the route?
[英]How do I handle elasticsearch's index timing when doing integration testing with mocha
我正在使用弹性搜索的节点项目上。 我的测试链是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 。 该调用返回后,您的文档将“处于活动状态”并且可以搜索。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.