如何使用Sinon存根“包装”功能?

问题描述 投票:1回答:1

我正在设置一个Lambda函数(node.js),例如,我们会保持最小化。

module.exports = (event, context, callback) {
  console.log("hello world")
}

但是,我创建了一个函数来包装lambda函数,该函数允许我在每个Lambda执行之前执行一些所需的函数(我有一组使用Serverless Application Model (SAM)连接的Lambda函数)。它还允许我整合每个函数的一些日志记录和错误处理。

// hook.js
const connect = fn => (event, context, callback) => {
  someFunction()
    .then(() => fn(event, context, callback))
    .then(res => callback(null, res))
    .catch(error => {
      // logging
      callback(error)
    })
}

module.exports = { connect }

// index.js
const Hook = require("./hook")

exports.handler = Hook.connect((event, context, callback) => {
  console.log("hello world")
})

逻辑运行良好,Lambda正在成功处理它。但是,我试图使用Hook.connect存根这个SinonJS函数,需要一些指导。

我只想将它存根以返回已解决的promise,这样我们就可以继续处理每个Lambda函数(fn(event, context, callback))中的代码。

const sinon = require("sinon")
const Hook = require("./hook")
const { handler } = require("./index")
const event = {} // for simplicity sake
const context = {} // for simplicity sake
const callback = {} // for simplicity sake

describe("Hello", () => {
  let connectStub

  beforeEach(() => {
    connectStub = sinon.stub(Hook, "connect").callsFake()

  afterEach(() => {
    connectStub.restore()
  })

  it("works", () => {
    const results = handler(event, context, callback)
    // assert
  })
})

我尝试了几种不同的方法,从基本的sinon.stub(Hook, "connect")到更复杂的方法,我试图使用hook.jsrewire文件中存根私有函数。

任何帮助将不胜感激 - 谢谢你提前。

javascript node.js lambda sinon
1个回答
2
投票

这是一个工作测试:

const sinon = require('sinon');
const Hook = require('./hook');

const event = {}; // for simplicity sake
const context = {}; // for simplicity sake
const callback = {}; // for simplicity sake

describe('Hello', () => {

  let handler, connectStub;
  before(() => {
    connectStub = sinon.stub(Hook, 'connect');
    connectStub.callsFake(fn => (...args) => fn(...args));  // create the mock...
    delete require.cache[require.resolve('./index')];  // (in case it's already cached)
    handler = require('./index').handler;  // <= ...now require index.js
  });

  after(() => {
    connectStub.restore();  // restore Hook.connect
    delete require.cache[require.resolve('./index')];  // remove the modified index.js
  });

  it('works', () => {
    const results = handler(event, context, callback);  // it works!
    // assert
  });
});

细节

index.js呼叫Hook.connect一旦它运行就创造出口的handler,并且它一旦它是required就运行...

...所以Hook.connect的模拟需要在index.jsrequired之前就位:

Node.js caches modules,所以这个测试也会在测试之前和之后清除Node.js缓存,以确保index.js获取Hook.connect模拟,并确保index.js与模拟的Hook.connect从缓存中删除,以防以后需要真正的index.js

© www.soinside.com 2019 - 2024. All rights reserved.