如何在Node.js中Mock Elasticsearch的nodes.stats()方法?
如何Mock Elasticsearch的client.nodes.stats()方法?
我想用Node.js查询Elasticsearch的统计信息,源码如下:
const {Client} = require('@elastic/elasticsearch'); client = new Client({ Connection:'appropriate aws connection', node:'some url', agent:{ keepalive:, maxsocket:, maxfreesocket: } }) const stats = await client.nodes.stats(); console.log(stats); // some operation on stats
我尝试了以下代码,但无法Mock stats()方法:
let sandbox = sinon.createSandbox(); before(()=>{ sandbox.stub(Client.prototype,'nodes').get(()=>{ stats: ()=>{ return dymmydata; } //where dummydata is already hardcoded }) })
问题出在哪?
你当前的Stub写法存在两个核心问题:
nodes是Client实例的属性而非方法,你用.get()的方式Stub时,返回的stats只是普通函数,但原client.nodes.stats()是异步方法,sinon需要正确识别Stub的层级结构。- 没有正确模拟异步方法的返回逻辑,原ES客户端方法都是Promise异步调用,直接返回数据会导致测试中出现异步处理错误。
正确的Mock方式
方式一:直接Stub嵌套的stats方法
const { Client } = require('@elastic/elasticsearch'); const sinon = require('sinon'); const dummyData = { /* 你的模拟统计数据 */ }; let sandbox = sinon.createSandbox(); before(() => { // 直接Stub Client原型上nodes属性下的stats方法,模拟异步返回 sandbox.stub(Client.prototype.nodes, 'stats').resolves(dummyData); }); after(() => { // 测试后恢复沙箱,避免污染其他测试 sandbox.restore(); });
方式二:Stub整个nodes对象(如果nodes是getter属性)
如果nodes是通过getter定义的属性,可以直接Stub整个nodes对象并返回包含Stub化stats方法的结构:
before(() => { sandbox.stub(Client.prototype, 'nodes').get(() => ({ // 用sinon.stub().resolves()模拟异步方法 stats: sinon.stub().resolves(dummyData) })); });
注意事项
- 确保
dummyData的结构和真实ES返回的统计数据结构一致,这样后续的业务逻辑处理才不会出错。 - 所有异步方法的Mock都要用
resolves()(或rejects()模拟错误)来匹配原方法的Promise行为。
内容的提问来源于stack exchange,提问作者Makarand
相关产品推荐
相关产品推荐

