我正在设置一个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.js
在rewire文件中存根私有函数。
任何帮助将不胜感激 - 谢谢你提前。
这是一个工作测试:
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.js
是required
之前就位:
Node.js caches modules,所以这个测试也会在测试之前和之后清除Node.js缓存,以确保index.js
获取Hook.connect
模拟,并确保index.js
与模拟的Hook.connect
从缓存中删除,以防以后需要真正的index.js
。