我正在尝试执行以下Jest测试以在本地测试AWS Lambda:
const sinon = require('sinon');
const AWS = require('aws-sdk');
const { handler } = require('../queue_manager.js');
let result = {
// some result
};
let sinonSandbox;
beforeEach((done) => {
sinonSandbox = sinon.createSandbox();
done();
})
afterEach((done) => {
sinonSandbox.restore()
done();
})
it('queue-manager', async () => {
sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'get').returns({
promise: function () {
return Promise.resolve(result);
}
});
const lambdaResponse = { code: 200, data: 'some mocked data' };
var callback = function() { };
var context = {}
const event = {
somedata: "data"
};
const actualValue = await handler(event, context, callback);
expect(actualValue).toEqual(result);
});
我正在尝试在DynamoDB调用之后测试处理,但是,测试失败并显示以下内容:超时-在jest.setTimeout.Timeout指定的5000ms超时内未调用异步回调
我尝试给它更多的时间,但是结果却是相同的,所以并不是不是它不能在5秒钟内成功返回,而是没有全部返回。
任何熟悉Sinon的人都可能指出我的问题?
答案 0 :(得分:0)
帖子编辑,第一版推到答案的底部
这是一个有关如何使用Jest测试异步功能的示例
test('the data is peanut butter', done => {
function callback(data) {
try {
expect(data).toBe('peanut butter');
done();
} catch (error) {
done(error);
}
}
fetchData(callback);
});
然后,我认为代码中缺少的部分是单元测试功能上的done
回调。你可以试试这个吗?
it('queue-manager', async (done) => {
sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'get').returns({
promise: function () {
return Promise.resolve(result);
}
});
const lambdaResponse = { code: 200, data: 'some mocked data' };
var callback = function() { };
var context = {}
const event = {
somedata: "data"
};
const actualValue = await handler(event, context, callback);
expect(actualValue).toEqual(result);
done();
});
另一个选择可能是指定断言的数量(而不是回调done
):
// before the await handler(...)
expect.assertions(1);
希望获得帮助。
lambda通常不返回结果,然后超时,因为lambda函数正在等待资源,例如:dynamoDB连接。
您可以通过将context.callbackWaitsForEmptyEventLoop设置为false来配置运行时以立即发送响应。
处理程序的第一行必须是:
context.callbackWaitsForEmptyEventLoop = false